LKJZ35-复杂链表的复制
https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
1.拷贝节点链接到原节点的后面
2.处理拷贝节点的random
3.把拷贝链表从原链表里拆解出来
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head==nullptr){
return nullptr;
}
//1.拷贝原链表的每个节点链接到原节点的后面
//cur copy next1
Node*cur=head;
while(cur!=nullptr){
Node*copy=new Node(cur->val);
Node*next1=cur->next;
cur->next=copy;
copy->next=next1;
cur=next1;//迭代
}
//2.处理拷贝节点的random
//cur copy
cur=head;
while(cur!=nullptr){
Node*copy=cur->next;
if(cur->random){
copy->random=cur->random->next;
}
else{
copy->random=nullptr;
}
cur=copy->next;//迭代
}
//3.拆解
//cur copy next1
cur=head;
Node*copyhead=cur->next;
while(cur!=nullptr){
Node*copy=cur->next;
Node*next1=copy->next;
cur->next=next1;
if(next1){
copy->next=next1->next;
}
else{
copy->next=nullptr;
}
cur=next1;//迭代
}
return copyhead;
}
};
时间复杂度O(N)-遍历3次链表
空间复杂度O(1)