【链表经典面试题】LeetCode138.复制带随机指针的链表(链表深拷贝)

📇文章目录

  • 🚀题目描述
  • 🚀思路1:
  • 🚀思路2:
  • 🚀完整代码

🚀题目描述

在这里插入图片描述
在这里插入图片描述

解读: 题目意思就是 给你一个链表 这个链表中除了有next指针之外 还有一个指向这个链表的随机位置的一个指针,让你复制这一个链表
而你复制之后的这个链表中的每一个节点的随机指针,也应该像原链表一样指向对应的节点

这里容易有一个误区,就是把拷贝之后的节点的随机指针random 置成原链表的random,这是不对的,因为他的意思是相当于让你把链表的结构也复制过来
比如说
原链表是7->13->11>10->1 ,其中13的random指向的是原链表中的7
那么你拷贝之后的链表也是 7->13->11->10->1 并且13指向拷贝之后的链表中的7

那么具体怎么做呢?
主要难搞的就是这个random 

🚀思路1:

7->13->11->10->1这个链表为例
复制之后我的13节点的random应该指向7 那么我遍历一遍去找值为7的节点不就可以了吗?
但是我们要想一想
如果这个链表是 7->7->13->11->10>1呢?
有两个节点的值都是7 ,那么返回哪一个呢? 是不是就不行了!
而且在效率方面最坏的情况,每一个节点都需要遍历一遍
时间复杂度是O(N^2)
所以这是一种错误思路!(怕就怕他有不止一个相同的值)

🚀思路2:

(想不到就没法做!!),技巧性很强,所以先看步骤

  1. 每一个拷贝的节点都直接链接在原节点的后面,形成一个大链表(考察链表节点的插入)在这里插入图片描述

  2. 然后通过原节点的random去找拷贝节点的random
    复制节点的random 就等于 原节点的randomnext(考察逻辑)
    如图分析在这里插入图片描述

    分析:拷贝链表中的random肯定和原链表中的random是有关系的,那么关系是什么呢?
    拷贝链表中的random一定指向了拷贝链表中的某一个节点
    这个节点怎么找呢?
    这就需要借助原链表
    因为我们把原链表和拷贝链表已经连接起来了,并且每一个拷贝节点是原链表的相同节点的next
    我们还是拿13这个节点为例,看上图
    原链表13的random指向的位置 的下一个就是与原链表13的random指向的节点的拷贝(注意理解这句话!!)
    之所以这么做是因为:拷贝链表的random要指向自己所在的链表的节点!
    所以 拷贝节点的random就是 原节点的random指向的next
    如果currandom为空,那么拷贝链表的random也为空

3.合并之后的链表拆分下来(考察链表的删除和尾插)
如图:在这里插入图片描述
也就是重新遍历一遍合并后的大链表
cur指向原链表,每一次循环 都定义一个copy节点等于curnext
把copy节点尾插到新的头 并把原链表中的相邻节点连接起来(相当于删除pos位置然后链接前后节点)

🚀完整代码

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) {struct Node* cur=head;//1. 拷贝原链表的值 并且链接原链表while(cur){//每一次都malloc一个新节点出来,把新节点和原链表连接起来struct Node* copy=(struct Node*)malloc(sizeof(struct Node));struct Node* next=cur->next;//copy的值 是cur的值copy->val=cur->val;//然后链接 cur copy nextcur->next=copy;copy->next=next;//然后让cur向后走cur=next;}//2. 然后拷贝random指针cur=head;//让cur重新指向headwhile(cur){//因为已经链接上了原链表// 所以每一次进来可以利用cur找到copystruct Node* copy=cur->next;if(cur->random==NULL){copy->random=NULL;;}else{copy->random=cur->random->next;}//然后更新curcur=copy->next;}//3. 把原链表和拷贝链表分离开cur=head;struct Node* copyNhead=NULL,*copyTail=NULL;while(cur){//每一次找到我的拷贝链表struct Node*copy=cur->next;// 拷贝链表的下一个(用于恢复原链表(链接原链表的两个节点))struct Node*next=copy->next;//如果新链表尾为空 那么就头插if(copyTail==NULL){copyTail=copyNhead=copy;}else{// 如果拆出来的拷贝链表不为空 // 那么 tail的next赋值为copy// 然后 更新尾copyTail->next=copy;copyTail=copy;}// 然后cur向后走cur->next=next;//这是恢复原链表cur=next;}return copyNhead;}

在这里插入图片描述
     感谢阅读哦 给个赞把~~😛

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/31831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚函数 虚表指针

虚函数表和虚表指针 1,虚函数的含义 用virtual声明类的成员函数称之为虚函数 2,作用 用于实现多态 存在继承关系,子类继承父类 子类重写了父类的virtual function 子类以父类的指针或者引用的身份出现 3,虚函数的实现原理 其中的…

JavaScript知识点大总结来了-------这一篇就足够啦!!!

JavaScript基础知识 一、对象的使用 1、创建对象 这里创建对象的方法我们采用最常用的一种&#xff1a; //第一种 <script>var Person {name: "zhangsan",age: "19",weight: "140",hight: "170",print:function(){console.…

山东济南比较出名的起名大师的老师,中国最厉害的改名大师颜廷利:短命的小草,年年自损;长寿的大树,万古长青。。。(升命学说)

在中国第一起名大师的老师颜廷利教授的《升命学说》中&#xff0c;通过“净化论”、“和合法则”、“唯悟主义”以及“镜正理念”的阐述&#xff0c;我们得以窥见生命的不同维度。他以自然界中短命的小草与长寿的大树为例&#xff0c;揭示了生命形态的对比与哲理。 小草&#…

ADI Trinamic TMC2300 完美用于相机镜头的马达驱动芯片方案

TMC2300-LA是一款用于高达 1.2A RMS 的两相步进电机的低压驱动芯片&#xff0c;低电压的步进电机驱动器是用于电池供电的、空间和待机功率临界驱动器应用。它的静音驱动技术StealthChop™能够为便携式&#xff0c;家庭和办公应用程序的非窃听运动控制&#xff0c;确保安静&…

Java宝藏实验资源库(5)字符流

一、实验目的 掌握输入输出流的基本概念。掌握字符流处理类的基本结构。掌握使用字符流进行输入输出的基本方法。 二、实验内容、过程及结果 **12.12 (Reformat Java source code) Write a program that converts the Java source code from the next-line brace style to…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具&#xff0c;该工具是一款GUI工具&#xff0c;可以帮助广大研究人员通过ETW&#xff08;Event Tracing for Windows&#xff09;扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图&#xff0c;该…

WPF 深入理解一、基础知识介绍

基础知识 本系列文章是对个人 B站 up 微软系列技术教程 记录 视频地址 https://www.bilibili.com/video/BV1HC4y1b76v/?spm_id_from333.999.0.0&vd_source0748f94a553c71a2b0125078697617e3 winform 与 wpf 异同 1.winform 项目结构 编辑主要是在 Form1.cs(页面)&#…

顶顶通呼叫中心中间件-机器人测试流程(mod_cti基于FreeSWITCH)

感兴趣的话可以点后面链接添加联系方式顶顶通小孙 一、打开ccadmin-web并且创建分机 1、登录ccadmin-web 登录地址&#xff1a;http://ddcti.com:88 登录之后根据下图去登录ccadmin-web系统。 2、创建分机 点击呼叫中心 -> 点击分机设置 -> 点击新增&#xff0c;点击…

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…

聚焦 Navicat 17 新特性 | 查询与配置的革新之处

随着 Navicat 17 的发布&#xff0c;引起业界热烈讨论与关注&#xff0c;这也标志着 Navicat 的产品力再次飞跃。新版本引入的众多创新特性极大地提升了用户在数据库管理和数据分析方面的体验&#xff0c;涵盖模型设计与同步、数据字典、数据分析&#xff08;data profiling&am…

图说SpringCloudStream消息驱动

SpringCloud Stream消息驱动实现原理 通过定义Binder绑定器作为中间层&#xff0c;实现了应用程序和消息中间件之间实现细节的隔离。通过向应用程序暴露统一的Channel通道&#xff0c;可以让应用程序不再需要考虑各种不同的消息中间件实现的兼容性问题。当需要升级消息中间件&a…

第九届世界渲染大赛什么时候开始举办?

​第九届世界渲染大赛即将开启&#xff0c;全球设计师和艺术家将汇聚一堂&#xff0c;展现3D艺术的创新与美感。敬请期待这场业界顶级的视觉盛宴&#xff0c;让我们共同关注大赛的启幕时刻。 第九届世界渲染大赛开始时间 预计时间&#xff1a;2024年7月(中旬) 报名方法&#…

服务端代码编写中MySql大小写在Java中报错问题解决

报错信息&#xff1a; 原因&#xff1a;MySql和Java变量大小写产生的冲突。 经过查阅各个博客等&#xff0c;得出浅显结论&#xff08;不一定对&#xff09;&#xff1a;MySql大小写不敏感&#xff0c;Java大小写敏感&#xff0c;当Javabean转为MySql数据库表时&#xff0c;Ja…

高效处理大数据:Kafka的13个核心概念详解

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 大家好,我是你们的小米!今天我们来深入探讨一下Kafka这个强大而复杂的数据流平台。Kafka被广泛应用于高吞吐量、低延迟的数据流应用场景中。那么,我…

名校介绍|英国六所红砖大学

​近年来由于美国的拒签率增加&#xff0c;很多公派申请者&#xff0c;尤其是CSC资助的访问学者、公派联合培养学生及博士后研究学者&#xff0c;把出国目标改为其它发达国家&#xff0c;尤以英国居多&#xff0c;本文知识人网小编就重点介绍六所英国红砖大学。 我们在“英国大…

基于JSP技术的固定资产管理系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPServlet 工具&#xff1a;MyEclipse、Tomcat 系统展示 首页 注册界面…

RocketMQ的安装和原理

.RocketMQ的安装 一.RocketMQ安装 1.1.下载RocketMQ 下载地址&#xff1a;http://rocketmq.apache.org/release_notes/release-notes-4.2.0/ 下载后解压 Bin : 可执行文件目录 config&#xff1a;配置文件目录 Lib : 依赖库&#xff0c;一堆Jar包 1.2.配置ROCKETMQ_HOME…

uniapp中Error: project.configjson: libVersion 字段需为 string. string

错误如下 找到manifestjson文件到源码视图 添加这段代码"libVersion": "latest",即可

众爱宠物开源项目介绍

众爱宠物管理系统是一个集会员管理、宠物管理、商品管理、库存管理、数据管理、收银管理、多门店管理等功能于一体的综合管理系统&#xff0c;具有操作方便、简单、安全等优点。 开源项目地址

基于STM32和人工智能的智能仓储管理系统

目录 引言环境准备智能仓储管理系统基础代码实现&#xff1a;实现智能仓储管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能仓储管理与优化问题解决方案与优化收尾与总结 1. 引言 智能仓储管理系统通过结合STM32嵌…