法一:使用unordered_map
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head==NULL) return head;
unordered_map<Node*,Node*>mp;
Node *t=head;
while(t!=NULL){
mp[t]=new Node(t->val);
t=t->next;
}
t=head;
while(t!=NULL){
if(t->next){
mp[t]->next=mp[t->next];
}
if(t->random){
mp[t]->random=mp[t->random];
}
t=t->next;
}
return mp[head];
}
};
法二:使用递归
class Solution {
unordered_map<Node*, Node*> mp;
public:
Node* copyRandomList(Node* node) {
if (node == nullptr) return nullptr;
if (mp.count(node)) return mp[node]; //已创建过该节点
Node* ans = new Node(node->val);
mp[node] = ans; //老节点和新节点映射
ans->next = copyRandomList(node->next);
ans->random = copyRandomList(node->random);
return ans;
}
};
总结:
- map中指针也可以作为键或值
- 将链表放入hash表中,将节点换为键。可以更灵活地操作链表