LeetCode-138-随机链表的复制
题目
给你一个长度为 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
作为传入参数。
示例 1:
1 |
|
示例 2:
1 |
|
示例 3:
1 |
|
提示:
0 <= n <= 1000
-104 <= Node.val <= 104
Node.random
为null
或指向链表中的节点。
题解
这一题首先要明白什么是深度拷贝,简单来讲,深度拷贝就复制对象本身,而不是复制引用。
在这里的话,就是复制Node
节点。
这一题用哈希表可以说是非常好的方法了:
第一次遍历,把节点都存到哈希表里,需要注意的是,这里的哈希表保存的是原节点->新节点的映射,值的部分要用new Node(cur.val)
然后我们构建结果链表:遍历原来的链表,把next
和random
连接起来即可,最后返回哈希表里的头节点。
1 |
|
LeetCode-138-随机链表的复制
https://excelius.xyz/leetcode-138-随机链表的复制/