class Solution {
public:
// 解法一:哈希表
// Node* copyRandomList(Node* head) {
// if(head==nullptr) return nullptr;
// unordered_map<Node*,Node*> mp;
// for(Node* cur=head;cur!=nullptr;cur=cur->next){
// mp[cur]=new Node(cur->val);
// }
// for(Node* cur=head;cur!=nullptr;cur=cur->next){
// mp[cur]->next=mp[cur->next];
// mp[cur]->random=mp[cur->random];
// }
// return mp[head];
// }
// 解法二:原地修改
Node* copyRandomList(Node* head){
if(head==nullptr) return nullptr;
// 构造
for(Node* cur=head;cur!=nullptr;cur=cur->next->next){
Node* copy=new Node(cur->val);
copy->next=cur->next;
cur->next=copy;
}
// 重建random
for(Node* cur=head;cur!=nullptr;cur=cur->next->next){
if(cur->random!=nullptr){
cur->next->random=cur->random->next;
}
}
// 分离
Node* newHead=head->next;
for(Node* cur=head,*tmp=nullptr;cur!=nullptr && cur->next!=nullptr;){
tmp=cur->next;
cur->next=tmp->next;
cur=tmp;
}
return newHead;
}
};