周报
复制带随即指针的链表
题目描述:
思路:
法1.求出random和copy的相对距离,再利用相对距离处理copy的random
法2.将复制节点插入在原节点与下一个节点之间;根据原节点的random,处理复制节点的random;解复制节点,恢复原节点(实质是一个尾插的过程)。
代码实现(法2):
struct Node* copyRandomList(struct Node* head)
{ //复制新节点并插入链表中
struct Node* cur=head;
while(cur)
{
struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
copy->val=cur->val;
copy->next=cur->next;
cur->next=copy;
cur=copy->next;
}
//根据原节点,处理copy节点
cur=head;
while(cur)
{
struct Node* copy=cur->next;
if(cur->random==NULL)
copy->random=NULL;
else
copy->random=cur->random->next;
cur=copy->next;
}
//把copy节点解下来链接成新链表恢复原链表
struct Node* copyHead,*copyTail;
copyHead=copyTail=NULL;
cur=head;
while(cur)
{
struct Node* copy=cur->next;
struct Node* next=copy->next;
if(copyTail==NULL)
copyHead=copyTail=copy;
else
{
copyTail->next=copy;
copyTail=copy;
}
cur->next=next;
cur=next;
}
return copyHead;
}