【链表】Leetcode 138. 复制带随机指针的链表

本文介绍了如何解决LeetCode中的中等难度问题——复制带随机指针的链表。作者提供了一种解决方案,通过复制原链表并在原链表后插入新节点,然后处理随机指针,最后拆分链表。文章包括详细的解题思路、代码实现和边界情况处理。
摘要由CSDN通过智能技术生成

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

题目: 复制带随机指针的链表

题解:

代码实现:

完结撒花:


题目: 复制带随机指针的链表

题解:

这题虽然为中等难度,但找到方法后,考察的也仅是链表的增删查改四种操作。

这题可能很多人题目都没看懂,其实就是将题所给的链表完整的复制出来。

hhh,那能不能直接return head呢?显然不能。为什么?因为我试过啦

那么正经来看看如何去解这道题呢?

这里提供一种思路:首先将每个链表复制到原链表的后一个节点上去(也就是插入一个相同的节点) 

 

 之后每一个copy节点的random就为原节点的random->next,将其连接就好

 

 之后再将copy链表拆除出来:copy->next等于copy->next->next,也就是跳过了下一个原节点。

 

 之后在返回第一个copy节点就可以了。

第一个while循环为复制插入copy节点,当cur指针不为空的时候,三个指针轮流交换即可。很基础的插入操作,这里就不过多赘述。

插入后为这样。 

 之后每一个copy节点的random就为原节点的random->next,将其连接就好

当然这里涉及到一个边界问题:当random为空指针的时候,直接将其指向NULL即可

 

最后先记录下复制的头节点(也可以不记录,直接返回head->next也可) 

提交代码:

代码实现:



#include<stdio.h>
#include<malloc.h>

struct Node {
     int val;
     struct Node *next;
     struct Node *random;
 };

struct Node* copyRandomList(struct Node* head) {
    struct Node * cur=head;
    if(!head)return head;
    while(cur)
    {
        struct Node *copy=(struct Node*)malloc(sizeof(struct Node));
        struct Node *next=cur->next;
        copy->val=cur->val;
        copy->next=next;
        cur->next=copy;
        cur=next;
    }
    cur=head;
    while(cur)
    {
        struct Node *copy=cur->next;
        struct Node *next=cur->next->next;
        if(cur->random==NULL)
            copy->random=NULL;
        else    
            copy->random=cur->random->next;
        cur=next;
    }
    cur=head;
    struct Node *head2=cur->next;
    while(cur)
    {
        struct Node *copy=cur->next;
        struct Node *next=cur->next->next;
        if(!next)
            copy->next=NULL;
        else copy->next=next->next;
        cur->next=next;
        cur=next;
    }
    

	return head2;
}

完结撒花:

🌈本篇博客的内容【链表:Leetcode 138. 复制带随机指针的链表】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值