看不懂题目可太难了,直接return head不行,先复制next再复制random也不行……遍历复制可以构建next引用指向,无法构建random引用指向。参考了大佬的题解:剑指 Offer 35. 复杂链表的复制(哈希表 / 拼接与拆分,清晰图解
1.哈希表
/*
// 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){
return NULL;
}
unordered_map<Node*,Node*> list;
Node* cur=head;
while(cur){
list[cur]=new Node(cur->val);
cur=cur->next;
}
cur=head;
while(cur){
list[cur]->next=list[cur->next];
list[cur]->random=list[cur->random]; //为什么相等?因为哈希表的键和值都是一样的Node*
cur=cur->next;
}
return list[head];
}
};
2.拼接+拆分
与哈希表过程类似,直接在链表上操作,需要三次遍历,最后一次遍历是拆分新链表和原有链表。