document.write('
一般而言,要删除单链表中的一个结点p,首先需要找到结点p的前驱结点pre,然后通过
pre.next=p.next来实现对结点p的删除。对于本题而言,由于无法获取到结点p的前驱结点,因此,不
能采用这种传统的方法。
那么如何解决这个问题呢?可以分如下两种情况来分析:
(1)如果这个结点是链表的最后一个结点,那么无法删除这个结点。
(2)如果这个结点不是链表的最后一个结点,可以通过把其后继结点的数据复制到当前结点中,然后
删除后继结点的方法来实现。实现方法如下图所示:
在上图中,首先把结点p的后继结点的数据复制到结点p的数据域中;接着把结点p的后继结点删除。
实现代码如下:
class LNode:
def __new__(self,x):
self.data=x
self.next=None
def printList(head):
cur=head.next
while cur!=None:
print cur.data,
cur=cur.next
"""
方法功能: 给定单链表中某个结点, 删除该结点
输入参数: 链表中某结点
返回值: true: 删除成功; false: 删除失败
"""
def RemoveNode(p):
#如果结点为空, 或结点p无后继结点则无法删除
if p==None or p.next==None:
return False
p.data=p.next.data
tmp=p.next
p.next=tmp.next
return True
if __name__=="__main__":
i=1
head=LNode()#链表头结点
head.next=None
tmp=None
cur=head
p=None
#构造链表
while i<8:
tmp=LNode()
tmp.data=i
tmp.next=None
cur.next=tmp
cur=tmp
if i=5:
p=tmp
i+=1
print "删除结点"+str(p.data)+"前链表:",
printList(head)
result=RemoveNode(p)
if result:
print "\\n删除该结点后链表:",
printList(head)
程序的运行结果为:
删除结点5前链表:1 2 3 4 5 6 7
删除该结点后链表:1 2 3 4 6 7
算法性能分析:
由于这种方法不需要遍历链表,只需要完成一个数据复制与结点删除的操作,因此,时间复杂度为
O(1)。由于这种方法只用了常数个额外指针变量,因此,空间复杂度也为O(1)。
');