https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
思路一:借助哈希表,建立新旧节点之间的映射即可。
/*
// 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==NULL)
return NULL;
unordered_map<Node*,Node*> m;
Node *cur=head,*n;
while(cur!=NULL)
{
n=new Node(cur->val);
m[cur]=n;
cur=cur->next;
}
cur=head;
while(cur!=NULL)
{
n=m[cur];
n->next=m[cur->next];
if(cur->random!=NULL)
n->random=m[cur->random];
cur=cur->next;
}
return m[head];
}
};
思路二:不花费额外的空间。首先在每个节点后面挂一个新的节点(复制),然后再次遍历链表,这时候的 r a n d o m random random就比较好处理了。
/*
// 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==NULL)
return NULL;
Node *n,*cur=head,*nxt;
while(cur!=NULL)
{
n=new Node(cur->val);
nxt=cur->next;
n->next=nxt;
cur->next=n;
cur=nxt;
}
cur=head;
while(cur!=NULL)
{
nxt=cur->next;
nxt->random=cur->random;
if(nxt->random!=NULL)
nxt->random=nxt->random->next;
cur=cur->next;
if(cur!=NULL)
cur=cur->next;
}
Node *ans=head->next;
cur=head,nxt=cur->next;
while(cur!=NULL)
{
nxt=cur->next;
cur->next=nxt->next;
cur=cur->next;
if(cur!=NULL)
nxt->next=cur->next;
}
return ans;
}
};