给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
示例:
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
- 你必须返回给定头的拷贝作为对克隆列表的引用。
一、思路
使用map来保存节点,每次创建新的节点时,需要创建next与random域时,先从map表中找,找不到了,再递归地创建新节点。
C++代码:
class Solution {
public:
map<int, Node*> list;
Node* copyRandomList(Node* head) {
if (head == NULL)
return NULL;
Node* copy_node = new Node(head->val, NULL, NULL);
list.insert(map<int, Node*>::value_type(copy_node->val, copy_node));
if (head->next == NULL)
1;
else if (list.count(head->next->val) == 0)
copy_node->next = copyRandomList(head->next);
else
copy_node->next = list[head->next->val];
if (head->random == NULL)
1;
else if (list.count(head->random->val) == 0)
copy_node->random = copyRandomList(head->random);
else
copy_node->random = list[head->random->val];
return copy_node;
}
};