1. 程式人生 > >【劍指offer】複雜連結串列的複製

【劍指offer】複雜連結串列的複製

題目描述
輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的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)