劍指Offer(Python多種思路實現):複雜鏈表的複製

劍指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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章