劍指Offer(Python多種思路實現):複雜鏈表的複製
面試35題:
題目:複雜鏈表的複製
題:輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
解題思路一:“Python”
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
import copy
return copy.deepcopy(pHead)
解題思路二:
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if pHead==None:
return None
self.CloneNodes(pHead)
self.ConnectRandomNodes(pHead)
return self.ReconnectNodes(pHead)
def CloneNodes(self,pHead):
'''
複製原始鏈表的每個結點, 將複製的結點鏈接在其原始結點的後面
'''
pNode=pHead
while pNode:
pCloned=RandomListNode(0)
pCloned.label=pNode.label
pCloned.next=pNode.next
pNode.next=pCloned
pNode=pCloned.next
def ConnectRandomNodes(self,pHead):
'''
將複製後的鏈表中的克隆結點的random指針鏈接到被克隆結點random指針的後一個結點
'''
pNode=pHead
while pNode:
pCloned=pNode.next
if pNode.random!=None:
pCloned.random=pNode.random.next
pNode=pCloned.next
def ReconnectNodes(self,pHead):
'''
拆分鏈表:將原始鏈表的結點組成新的鏈表, 複製結點組成複製後的鏈表
'''
pNode=pHead
pClonedHead=pClonedNode=pNode.next
pNode.next = pClonedNode.next
pNode=pNode.next
while pNode:
pClonedNode.next=pNode.next
pClonedNode=pClonedNode.next
pNode.next=pClonedNode.next
pNode=pNode.next
return pClonedHead
解法三:遞歸法。
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if pHead==None:
return None
newNode=RandomListNode(pHead.label)
newNode.random=pHead.random
newNode.next=self.Clone(pHead.next)
return newNode