【劍指offer】複雜連結串列的複製
阿新 • • 發佈:2018-11-26
題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的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)