力扣-复制带随机指针的链表

题目

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

思路

还是想清楚题目要我们干嘛,对于要求我们需要怎么做用哪些方法和思路
对于这道题,我们需要做的事情其实是对于已经创建好的节点,再新的一次加指针可以指向这个节点,那我们可以模拟原始链表的创建和引用过程,区分创建/指向的过程,先创建随机的节点,直到创建不了之后再走next节点,如果已经被创建就直接指向它,具体如何找到已经创建的节点,可以做一个Dict采用旧链表的node-创建顺序,用旧节点再处理引用关系的时候,同时拿到这个创建顺序id,同时维护一个新节点的创建顺序对应节点,在原链表走引用时这里也去表里拿一遍,先创建随机节点再处理先后节点

他山之石

学习对比他人的思路:

代码

    def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':

        if(head == None):

            return None

        oldTabNode2Num = {}

        newTabNum2Node = {}

        newHead = Node(head.val)

        ans = newHead

        oldTabNode2Num[head] = 0

        newTabNum2Node[0] = newHead

        curIndex = 1

        while(head != None):

            createNode = head

            newCreateNode = newHead

            while(createNode.random !=None and createNode.random not in oldTabNode2Num):

                oldTabNode2Num[createNode.random] = curIndex

                createNode = createNode.random

                newCreateNode.random = Node(createNode.val)

                newTabNum2Node[curIndex] = newCreateNode.random

                curIndex += 1

                newCreateNode = newCreateNode.random

            if(createNode.random == None):

                newCreateNode.random = None

            else:

                newCreateNode.random = newTabNum2Node[oldTabNode2Num[createNode.random]]

            if(not head.next):

                newHead.next = None

                break

            if( head.next not in oldTabNode2Num):

                newHead.next = Node(head.next.val)

                oldTabNode2Num[head.next] = curIndex

                newTabNum2Node[curIndex] = newHead.next

                curIndex += 1

            else:

                newHead.next = newTabNum2Node[oldTabNode2Num[head.next]]

            head = head.next

            newHead = newHead.next

        return ans

你可能感兴趣的:(力扣,leetcode,链表,算法)