思路
深拷贝:即复制一个链表,复制之后两个链表相互独立,互不影响
复制链表只需要解决两个问题
- next指针:先将链表全部节点push进vector,之后再将前一个指向后一个即可
- 随机指针
最大的问题在于如何处理随机指针:(map处理)
(1)将节点分成第1到第n号
(2)遍历节点时,将节点random的地址存入map的key,其所对应的val即为指向第几号节点
(3)这样就知道了每个节点所随机指向的节点
然后我们在重新建立新的链表的时候,只需要查询map,就可以知道当前节点所随机指向的是哪一个节点了
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
Node *ptr = head;
vector<Node *> olist;
unordered_map<Node *, int> node;
for (int i = 0; ptr != nullptr; ++i) {
olist.push_back(new Node(ptr->val, nullptr, nullptr));
node[ptr] = i;
ptr = ptr->next;
}
olist.push_back(nullptr);
ptr = head;
for (int i = 0; ptr != nullptr; ++i) {
olist[i]->next = olist[i+1];
if (ptr->random != nullptr)
olist[i]->random = olist[node[ptr->random]];
ptr = ptr->next;
}
return olist[0];
}
};