【数据结构】习题之随机链表的复制

本文详细解析了如何在LeetCode上的随机链表问题中进行复制,包括插入拷贝节点、控制random指针和解下拷贝节点的过程,提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 👑个人主页:啊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.要记得恢复原节点

感谢大家阅读,希望我的博客能为你提供思路,一起坚持下去吧!!!

希望友友三连支持一下👌 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值