剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制
思路
对链表进行深拷贝
1.哈希(空间复杂度O(N))
2.用复制链表再拆开的方法(空间复杂度O(1))
a->b->c->NULL
复制节点
a->a'->b->b'->c->c'->NULL
复制每个节点的random指针,注意a指向b,而a'指向b后面的b'
拆解成两个链表
a->b->c->NULL
a'->b'->c'->NULL
代码
哈希
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head==NULL)
return head;
unordered_map<Node*,Node*> hash;
Node* new_head=new Node(head->val);
Node* pos=head;
Node* copy=new_head;
while(pos!=NULL)
{
hash[pos]=copy;
pos=pos->next;
if(pos==NULL)
{
copy->next=NULL;
}else
{
copy->next=new Node(pos->val);
}
copy=copy->next;
}
copy=new_head;
pos=head;
while(pos!=NULL)
{
copy->random=hash[pos->random];
copy=copy->next;
pos=pos->next;
}
return new_head;
}
};
复制链表再拆开
class Solution {
public:
void coutNodes(Node* head)
{
while(head!=NULL)
{
if(head->random==NULL)
{
cout<<head->val<<" "<<"NULL"<<endl;
}else
{
cout<<head->val<<" "<<head->random->val<<endl;
}
head=head->next;
}
}
void copyNode(Node* head)
{
while(head!=NULL)
{
Node* clone=new Node(head->val);
clone->next=head->next;
head->next=clone;
head=clone->next;
}
}
void copyRandom(Node* head)
{
while(head!=NULL)
{
Node *random=head->random;
head=head->next;
if(random==NULL)
{
head->random=NULL;
}else
{
head->random=random->next;
}
head=head->next;
}
}
Node* splitNodes(Node* head)
{
Node* newHead=head->next;
Node* copy1=newHead;
while(copy1!=NULL)
{
Node* temp=copy1->next;
head->next=copy1->next;
if(temp!=NULL)
{
copy1->next=temp->next;
head=temp;
copy1=temp->next;
}else{
copy1->next=NULL;
head=NULL;
copy1=NULL;
}
}
return newHead;
}
Node* copyRandomList(Node* head) {
if(head==NULL)
return NULL;
copyNode(head);
//coutNodes(head);
copyRandom(head);
//coutNodes(head);
Node* res= splitNodes(head);
//coutNodes(res);
return res;
}
};