【剑指offer】复杂链表的复制

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

猜你喜欢

转载自blog.csdn.net/weixin_36372879/article/details/84075059