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

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

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


🌈个人主页:主页链接


🌈算法专栏:专栏链接


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


🌈LeetCode专栏:专栏链接


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


🌈代码仓库:Gitee链接


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



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


60a59209047942a1bafcf91d62fa1c23.png


题解:


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


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


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


1b51b52e1718448e9633e59cdf0bcccd.png


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


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

0d6d6a858ee346f69fed2179aff1806f.jpg


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


b3ddf3f91ffe4c95879a2476debfd696.jpg


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


cce2aa651a2d40c2855b9c5ea7e9e962.jpg


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


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

74bc24af1b59491ab68337ce92ad4cbe.jpg


插入后为这样。


784407da581e4ad8b64ede269c804938.jpg


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

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

07884f1a7e494c8da93e902929884d85.jpg


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


2a93d8dfb4db4acb9ef06a79ed1dbc1c.jpg


提交代码:


3d846899b7a94682951e1491f2b7258a.png


代码实现:


#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月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
48 0
Leetcode第21题(合并两个有序链表)
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
17 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
40 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
77 0
|
1月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
18 0
|
1月前
|
C语言
无头链表二级指针方式实现(C语言描述)
本文介绍了如何在C语言中使用二级指针实现无头链表,并提供了创建节点、插入、删除、查找、销毁链表等操作的函数实现,以及一个示例程序来演示这些操作。
22 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
16 0
|
1月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0