提示:由于画图比较容易理解,所以我们思路讲解一般是图像配上文字
一、题目描述
题目链接:力扣
二、解题思路
本次题目考查对于链表的插入,删除等考查的比较全面,我们采用的方法主要如下
(该方法时间复杂度为 O(N))
2.1 复制链表
图都是自己画的,不好请见谅
下面配上对应的代码,可以边看图边看代码,方便理解
//复制链表,且跟在本体后面
while(cur)
{
struct Node* cupy=(struct Node*)malloc(sizeof(struct Node));
struct Node* next=cur->next;
cupy->val=cur->val;
cupy->next=next;
cur->next=cupy;
cur=next;
}
2.2 给复制出来的链表的random赋值
2.3 将复制的链表从原链表移除
while(cur)
{
struct Node* next=cur->next->next;
if(tail==NULL)
{
tail=cupy=cur->next;
cur->next=next;
cur=next;
}
else
{
tail->next=cur->next;
cur->next=next;
cur=next;
tail=tail->next;
}
}
三、代码
struct Node* copyRandomList(struct Node* head) {
struct Node* cur=head;
//复制链表,且跟在本体后面
while(cur)
{
struct Node* cupy=(struct Node*)malloc(sizeof(struct Node));
struct Node* next=cur->next;
cupy->val=cur->val;
cupy->next=next;
cur->next=cupy;
cur=next;
}
cur=head;//cur重置
//给复制体的random赋值
while(cur)
{
struct Node* cupy=cur->next;
if(cur->random==NULL)
{
cupy->random=NULL;
cur=cur->next->next;//找下一个本体,因为中间隔了一个复制体,所以需要跨两步
}
else
{
cupy->random=cur->random->next;
cur=cur->next->next;//找下一个本体,因为中间隔了一个复制体,所以需要跨两步
}
}
cur=head;
struct Node* cupy=NULL;
struct Node* tail=NULL;
while(cur)
{
struct Node* next=cur->next->next;
if(tail==NULL)
{
tail=cupy=cur->next;
cur->next=next;
cur=next;
}
else
{
tail->next=cur->next;
cur->next=next;
cur=next;
tail=tail->next;
}
}
return cupy;
}