👑个人主页:啊Q闻
🎇收录专栏:《数据结构》
🎉前路漫漫亦灿灿
前言
力扣上的一道题目,这道题目是一个随机链表,每个节点都有一个随机指针,解答思路很新奇。
随机链表的复制
题目为:. - 力扣(LeetCode)
如何进行这份随机链表的复制呢?
思路为:
1.插入拷贝节点在原节点后面,是为了便于找到拷贝节点,找到了原节点,就可以找到拷贝节点。
2.控制copy-->random指向原节点(我们称为cur)的random的next,即copy-->random=cur-->random-->next。
3.将拷贝的节点解下来,尾插形成一个新的链表,然后恢复原链表
代码实现:
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=cur->next->next;
}
cur=head;//控制cop-->random指向
while(cur)
{
struct Node*copy=cur->next;
if(cur->random==NULL)
{
copy->random=NULL;
}
else
{
copy->random=cur->random->next;
}
cur=cur->next->next;
}
struct Node*copyhead=NULL,*copytail=NULL;//解下拷贝节点
cur=head;
while(cur)
{
struct Node*copy=cur->next;
struct Node*curnext=copy->next;
if(copytail==NULL)//尾插
{
copytail=copyhead=copy;
}
else
{
copytail->next=copy;
copytail=copytail->next;
}
cur->next=curnext;//恢复原节点
cur=curnext;
}
return copyhead;
}
注意:
1.当我们要用要cur去遍历时,要及时将cur指向头节点head,确保遍历顺利进行。
2.要记得恢复原节点
感谢大家阅读,希望我的博客能为你提供思路,一起坚持下去吧!!!
希望友友三连支持一下👌