地址:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
思路:map || 思维
思路一、map:对于原链表head以及复制链表hd,可以用map[head]=hd进行一一对应,这样在处理随机random指针时,直接用map对应到相应复制链表即可。
思路二、思维:对于复制链表来说随机指针由于找不到对于位置关系不好处理,因此可以将复制链表的节点插入到原链表对应节点后面,例如p1->pp1->p2->pp2->p3->>pp3,这样就能找到原链表与复制链表的对应关系了。
Code map:
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head==NULL) return NULL;
Node *hd,*p=head,*pi=hd;
unordered_map<Node*,Node*> im;
while(p!=NULL){
im[p]=new Node(p->val);
p=p->next;
}
im[NULL]=NULL;
p=head;
hd=im[p];
while(p!=NULL){
im[p]->next=im[p->next];
im[p]->random=im[p->random];
pi=im[p];
pi=pi->next;
p=p->next;
}
return hd;
}
};
Code 思维:
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head==NULL) return NULL;
Node *hd,*p=head,*pi;
while(p!=NULL){
pi=new Node(p->val);
pi->next=p->next;
p->next=pi;
p=pi->next;
}
p=head;
while(p!=NULL){
pi=p->next;
if(p->random==NULL) pi->random=NULL;
else pi->random=p->random->next;
p=pi->next;
}
hd=pi=head->next;
head->next=p=pi->next;
while(p!=NULL){
pi=pi->next=p->next;
p=p->next=pi->next;
}
return hd;
}
};