0%

copy-list-with-random-pointer

题目描述

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

要求返回这个链表的 深拷贝

题解

和之前的clone graph很相似,使用一个queue用来遍历所有节点,是用一个unordered_map来记录被访问过的节点(key)以及clone得到的新节点(value)。

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
Node* copyRandomList(Node* head) {
if (!head)return NULL;
queue<Node*>q;
unordered_map<Node*, Node*> m;
m[head] = new Node(head->val);
q.push(head);

Node *t1, *t2, *t3;
while (!q.empty())
{
t1 = q.front();
q.pop();
if (!m.count(t1))
m[t1] = new Node(t1->val);
t2 = t1->next;
if (t2)
{
if (!m.count(t2))
m[t2] = new Node(t2->val);
m[t1]->next = m[t2];
q.push(t2);
}
t3 = t1->random;
if (t3)
{
if (!m.count(t3))
m[t3] = new Node(t3->val);
m[t1]->random = m[t3];
}
}
return m[head];
}