版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_36372879/article/details/84075059
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
def CloneNodes(self, pHead):
pNode = pHead
while pNode:
CloneNode = RandomListNode(pNode.label)
CloneNode.next = pNode.next
pNode.next = CloneNode
pNode = CloneNode.next
return pHead
def Setrandom(self, pHead):
pNode = pHead
CloneNode = pHead.next
while pNode:
if pNode.random:
CloneNode.random = pNode.random.next
pNode = pNode.next.next
if pNode:
CloneNode = pNode.next
def Separate(self, pHead):
# CloneHead = pHead.next
# # CloneNode = CloneHead
# while CloneNode:
# if CloneNode.next:
# CloneNode.next = CloneNode.next.next
# CloneNode = CloneNode.next
# return CloneHead
pNode = pHead
pCloneHead = None
pCloneNode = None
if pNode != None:
pCloneHead = pCloneNode = pNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
while pNode != None:
pCloneNode.next = pNode.next
pCloneNode = pCloneNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
return pCloneHead
注意注释的代码中,只是把Clone链表进行了链接,但是没有链接原链表,这样的话pHead.next = pCloneHead,因此会造成两个链表的地址重合,系统会判错,其实Clone链表是对的,但是由于没将pHead还原,因此克隆的链表也没有意义,因此再拆分的时候,要分为两个完整的链表
class Solution:
# 返回 RandomListNode
def CloneNodes(self, pHead):
pNode = pHead
while pNode:
CloneNode = RandomListNode(pNode.label)
CloneNode.next = pNode.next
pNode.next = CloneNode
pNode = CloneNode.next
return pHead
def Setrandom(self, pHead):
pNode = pHead
CloneNode = pHead.next
while pNode:
if pNode.random:
CloneNode.random = pNode.random.next
pNode = pNode.next.next
if pNode:
CloneNode = pNode.next
def Separate(self, pHead):
# CloneHead = pHead.next
# # CloneNode = CloneHead
# while CloneNode:
# if CloneNode.next:
# CloneNode.next = CloneNode.next.next
# CloneNode = CloneNode.next
# return CloneHead
pNode = pHead
pCloneHead = None
pCloneNode = None
if pNode != None:
pCloneHead = pCloneNode = pNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
while pNode != None:
pCloneNode.next = pNode.next
pCloneNode = pCloneNode.next
pNode.next = pCloneNode.next
pNode = pNode.next
return pCloneHead
def Clone(self, pHead):
# write code here
if pHead == None:
return None
self.CloneNodes(pHead)
self.Setrandom(pHead)
return self.Separate(pHead)