# 复杂链表的复制
# 题目
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
# 思路
1、辅助哈希表
/**
* // Definition for a Node.
* function Node(val, next, random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
/**
* @param {Node} head
* @return {Node}
*/
var copyRandomList = function(head) {
if (!head) return null;
// 1.复制链表,建立“原节点->新节点”的映射
const map = new Map();
let node = head;
let newHead = new Node(node.val);
let newNode = newHead;
map.set(node, newNode);
while(node.next) {
newNode.next = new Node(node.next.val); // 复制节点
node = node.next;
newNode = newNode.next;
map.set(node, newNode);
}
// 2.处理random指针
newNode = newHead;
node = head;
while(newNode) {
newNode.random = map.get(node.random);
newNode = newNode.next;
node = node.next;
}
return newHead;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2、拼接与拆分
/**
* // Definition for a Node.
* function Node(val, next, random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
/**
* @param {Node} head
* @return {Node}
*/
var copyRandomList = function(head) {
if (!head) return null;
//1.复制一份链表放在前一个节点后面,即根据原始链表的每个节点N创建N,把N直接放在N的next位置,让复制后的链表和原始链表组成新的链表。
let node = head;
while(node) {
let copy = new Node(node.val);
copy.next = node.next;
node.next = copy;
node = node.next.next;
}
//2.给复制的链表random赋值,即N.random=N.random.next。
node = head;
while(node) {
if (node.random) {
node.next.random = node.random.next;
}
node = node.next.next;
}
//3.拆分链表,将N`和N进行拆分,保证原始链表不受影响。
let newHead = head.next;
node = head;
while(node && node.next) {
let tmp = node.next;
node.next = tmp.next;
node = tmp;
}
return newHead;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 本题难点
在复制链表的过程中构建新链表各节点的 random 引用指向。
# 考察点
- 链表
- 复杂问题拆解