. 复杂链表的复制
***++题目链接++***
题目介绍:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
unordered_map<Node*, Node*> map;
public:
Node* copyRandomList(Node* head) {
if(!head) return nullptr;
if(map.find(head) == map.end())
{
Node* node = new Node(head->val);
map[head] = node;
node->next = copyRandomList(head->next);
node->random = copyRandomList(head->random);
}
return map[head];
}
};
题解
- 这道题是一道 基于深拷贝 思想的链表题,意味着一定要做到深拷贝,将整个资源copy一份
- 特殊的,处理寻常链表具有的 next的指针, 它还有 一个指向 随机的 random的指针
- 对于深度拷贝,必然我们要主动 创建每一个节点,才能实现整体的拷贝
- 因为具有一个随机的指向, 所以, 为了不 多次的创建某一节点, 我们选择使用一个 单次存储的map来管理创建的资源
- -------------------------分割线------------------------------------------------------------
- 利用一个map 对需要创建head的拷贝值node时, 进行插入实现管理
- 如果已经创建过了,就不需要再做处理, 没有创建的话, 进入
- 创建改节点的拷贝,插入, 然后深度拷贝 它的next 节点和 random节点
- 因为利用的递归,偏向于深度的一种构建,对于链表来说,就可以说是完成了
- 返回值是copy的新的头节点, 即map --> key == head;