题目
给你一个长度为 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,同时维护一个新节点的创建顺序对应节点,在原链表走引用时这里也去表里拿一遍,先创建随机节点再处理先后节点文章来源:https://www.toymoban.com/news/detail-677356.html
他山之石
学习对比他人的思路:文章来源地址https://www.toymoban.com/news/detail-677356.html
代码
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
到了这里,关于力扣-复制带随机指针的链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!