【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表

简介: 哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表~ 都是精华内容,可不要错过哟!!!😍😍😍

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘

微信图片_20230427160707.gif


前言🙌


   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,和大家分享【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表~ 都是精华内容,可不要错过哟!!!😍😍😍


复制带随机指针的链表🙌


题目内容



微信图片_20230428202827.png

微信图片_20230428202827.png


画图分析:😍


微信图片_20230428202921.png


思路分析:😍


1.先认真审题,分析解题思路

2.这里用到了一个非常奇妙的方法,首先先拷贝对应的原结点,并将他们链接在原结点的后面。

3.然后设置生成结点的random指针。因为拷贝的结点都在原结点的后面。因此。让copy的random指针都指向cur->random->next。但是要除开一个特殊情况,当cur->random == NULL。则copy->random 也设置为NULL;

4.最后一步就是将拷贝的结点和原链表解开。这里采用尾插的方式,将其与原链表分开。然后将原链表的指向恢复过来就Ok啦~


源代码分享:😍


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 = copy->next;
    }
    //第二步,设置random指针
    cur = head;
    while(cur)
    {
         struct Node* copy = cur->next;
         if(cur->random == NULL)
         copy->random = NULL;
         else
         copy->random = cur->random->next;
         cur = copy->next;
    }
    //3 解开,恢复
    cur = head;
    struct Node* copyHead = NULL;
    struct Node* copyTail = NULL;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if(copyTail == NULL)
        copyHead = copyTail = copy;
        else
        {
            copyTail->next = copy;
            copyTail = copyTail->next;
        } 
        cur->next = next;
        cur = next;
    }
    return copyHead;
}


程序输出结果验证: 😊


微信图片_20230428203011.png


总结撒花💞


   本篇文章旨在分享【快乐手撕LeetCode题解系列】—— 复制带随机指针的链表。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

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