step1:思路分析
1.实现复制,且是两个独立的复制,我们必须要理清指针之间的逻辑,注意random的新指针要链接到复制体的后面。
2.我们先完成对于结点的复制,并将复制后的结点放在原节点的后面,并链接。
3.完成random结点的链接。
4.将复制后的链表从原链表上拆解下来(就是原链表删除 新链表尾插)。
step2:画图理解
1.如何实现copy
2.如何实现random
3.如何拆解
3.代码书写
struct Node* copyRandomList(struct Node* head) {
struct Node* cur=head;
while(cur)
{
struct Node* next=cur->next;
struct Node* copy= (struct Node*)malloc(sizeof(struct Node));
copy->val=cur->val;
copy->next=next;
cur->next=copy;
cur=next;
}
cur=head;
while(cur)
{
struct Node* copy=cur->next;
if(cur->random==NULL)
{
copy->random=NULL;
}
else{
copy->random=cur->random->next;
}
cur=cur->next->next;
}
cur=head;
struct Node* copyHead = NULL;
struct Node* copyTail = NULL;
while(cur)
{
struct Node* copy=cur->next;
struct Node* next=copy->next;
cur->next=next;
if (copyTail==NULL)
{
copyHead=copyTail=copy;
}
else{
copyTail->next=copy;
copyTail=copyTail->next;
}
cur=next;
}
return copyHead;
}