目录

一、题目介绍

​编辑

二、题目分析

三、代码实现


题目链接:138. 复制带随机指针的链表 - 力扣(LeetCode)


一、题目介绍

我们最一开始看到题目可能会没有思路,或者压根就不知道如何下手

下面我将提出一种简便的算法来解决这道题

二、题目分析

我们可以先将每一个节点都复制一份,然后将复制节点插入到原节点的后面

将每个复制节点的val都置为原节点的值,同时先不要修改复制节点的random,让它为随机值就好

如果我们在给复制节点的val赋值的同时将random也赋值,这个random

指针会指向原链表,而不会指向我们复制之后的链表,因为前面节点的random有可能会指向后面的节点,可是那个节点我们还没有复制出来,所以我们需要遍历链表两遍来处理复制链表节点

然后就剩下最后一步了,将复制节点从链表上取下来

为了方便我们可以使用哨兵位的头节点来进行尾插,返回哨兵位头节点的next

三、代码实现

struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}struct Node*cur=head;//链接节点while(cur){struct Node*copy=(struct Node*)malloc(sizeof(struct Node));struct Node*next=cur->next;copy->val=cur->val;cur->next=copy;copy->next=next;cur=next;}//处理randomcur=head;while(cur){struct Node*copy=cur->next;struct Node*next=copy->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=next;}//尾插形成新链cur=head;struct Node*newHead=(struct Node*)malloc(sizeof(struct Node));struct Node*tail=newHead;while(cur){struct Node*copy=cur->next;struct Node*next=copy->next;tail->next=copy;tail=copy;cur=next;}return newHead->next;
}

同时要注意,我们使用的是copy->random=cur->random->next;这条语句,如果cur的random指向的是NULL,我们在去访问NULL->next就会出现空指针的问题,这一点必须要注意

同时这段代码还有一个比较大的问题,我们malloc了一个newHead,我们没有free掉它,会出现内存泄漏的问题

因此我们这样修改

struct Node* copyRandomList(struct Node* head) {if(head==NULL){return head;}struct Node*cur=head;//链接节点while(cur){struct Node*copy=(struct Node*)malloc(sizeof(struct Node));struct Node*next=cur->next;copy->val=cur->val;cur->next=copy;copy->next=next;cur=next;}//处理randomcur=head;while(cur){struct Node*copy=cur->next;struct Node*next=copy->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=next;}//尾插形成新链cur=head;struct Node*newHead=(struct Node*)malloc(sizeof(struct Node));struct Node*tail=newHead;while(cur){struct Node*copy=cur->next;struct Node*next=copy->next;tail->next=copy;tail=copy;cur=next;}struct Node*ret=newHead->next;free(newHead);return ret;}

这样就过了

虽然我们在做oj题时,它不会报错,但是为了安全起见,我们必须手动释放malloc出的变量

【刷题日记】3.复制带随机指针的链表相关推荐

  1. 138. 复制带随机指针的链表 golang

    138. 复制带随机指针的链表 这个题结构体特殊,需要更改上一篇博客的node结构体 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深 ...

  2. M1: 复制带随机指针的链表

    一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...

  3. 【力扣】复制带随机指针的链表题解 C语言实现

    前言 这是力扣里的一道经典链表题,据说掌握此题你对链表的理解能力就是优秀水平了 题目 /*** Definition for a Node.* struct Node {* int val;* str ...

  4. LeetCode 138. 复制带随机指针的链表(哈希 / 深拷贝)

    1. 题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. <剑指Offer>同题:面试题35. 复杂链表的复制 2 ...

  5. java 链表复制_Java 算法 - 复制带随机指针的链表

    前段时间在做一个项目,所以没有时间做面试题,最近才将那个科创项目做的差不多了,于是开始做面试题了. 题意: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一 ...

  6. python 带随机指针的链表深度复制_LeetCode:复制带随机指针的链表

    请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. 思路: ...

  7. 【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例

    一.题目 ① 题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的深拷贝,深拷贝应该正好由 n 个全新节点 ...

  8. LeetCode 138 复制带随机指针的链表-中等

    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的 深拷贝. 深拷贝应该正好由 n 个 全新 节点组成,其中每个新 ...

  9. LeetCode 138 复制带随机指针的链表

    题目描述 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深拷贝. 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表.每个节点 ...

最新文章

  1. 机器学习基础专题:感知机
  2. 蓝桥杯java第八届第十题--k倍区间
  3. 解释BOM头和去掉方法
  4. 在Eigrp做不等值路由的负载均衡
  5. 前端学习(2254)team怎么接受到pr
  6. c位边上还有什么位_【一点资讯】那些有趣而搞笑的GIF动画:为让出c位,站边上拍照还是谦虚礼貌的 www.yidianzixun.com...
  7. python 删除第三方库_python中通过pip安装的第三方库在哪里
  8. Eclipse SVN图标等设置
  9. iPhone XS Max A2101(D3XP X1048 MLB P1 D33P) 820-01225 苹果手机点位图
  10. 微软升级网页版Skype 没有帐户也能拨打网络电话
  11. 一句话告诉您什么是运维?以及如何运维才能事半功倍?
  12. Credential Harvester的脚本修改
  13. mysql 模糊查找表名
  14. 易盾php,GitHub - yidun/antispam-php-demo: 易盾反垃圾php演示
  15. 该选国企,外企还是私企?
  16. 计算机组装时应该注意的硬件参数,教你看懂电脑配置参数,了解组装电脑基本知识...
  17. 数据库自动化运维平台--数据库巡检
  18. JAVA抽象求圆、矩形、正方形周长及面积
  19. 0001_halcon-测量函数说明
  20. 工信部大数据工程师认证考试顺利举行

热门文章

  1. 全球与中国1,2,4-三氟苯市场深度研究分析报告
  2. 用户注册登录-交互设计分析
  3. apache-ftpServer配置与使用
  4. 最新消息,马云在杭州开了一家惊艳世界的动物园!
  5. 夏爱婴早教中心经营问题
  6. Linux是多用户操作系统
  7. Webmin -- Users和Groups
  8. js粒子特效——particles
  9. web中打开PDF文件
  10. 数据库分页查询PageHelper