document.write('
一般而言,要删除单链表中的一个结点p,首先需要找到结点p的前驱结点pre,然后通过
pre.next=p.next来实现对结点p的删除。对于本题而言,由于无法获取到结点p的前驱结点,因此,不
能采用这种传统的方法。
 那么如何解决这个问题呢?可以分如下两种情况来分析:
 (1)如果这个结点是链表的最后一个结点,那么无法删除这个结点。
 (2)如果这个结点不是链表的最后一个结点,可以通过把其后继结点的数据复制到当前结点中,然后
删除后继结点的方法来实现。实现方法如下图所示:
\"360截图20190815223920095.jpg\"
 在上图中,首先把结点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)。

 

');