【链表经典面试题】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,一经查实,立即删除!

相关文章

python读数据,并且 csv格式的,如何应对。

s545112015022319.txt 要求 通过python 导入程序 高度(距地) 时间 气温 气压 湿度 露点 温露差 虚温 风向 风速 纬度差 经度差 0 0 0.0 0.9 1015 38 -11.8 12.7 1.6 203 1 0.0 0.0 1 10 0.0 2.3 1014 37 -11.0 13.3 3.0 203 …

平安健康CEO李斗谈如何破解居家养老行业痛点,打造优质服务

在人口老龄化趋势日益加剧的背景下,居家养老服务正成为满足老年人生活需求的重要一环。平安健康作为行业的领军企业,自2021年起便积极布局居家养老服务市场,并于2022年推出服务品牌“平安管家”。经过两年多的发展,平安健康董事长…

虚函数 虚表指针

虚函数表和虚表指针 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;该…

【DICOM】BitsAllocated字段值为8和16时区别

一、读取dicom C# 使用fo-dicom操作dicom文件-CSDN博客 二、DICOM中BitsAllocated字段值为8和16时区别 位深度差异&#xff1a; 当BitsAllocated为8时&#xff0c;意味着每个像素使用8位来表示其灰度值。这允许每个像素有2^8256种不同的灰度等级&#xff0c;适用于那些不需要高…

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

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

AI音乐革命:创意产业的新篇章

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域的应用越来越广泛&#xff0c;特别是在音乐产业中&#xff0c;AI音乐大模型的涌现&#xff0c;正在重新定义音乐创作的边界。最近一个月&#xff0c;随着多个音乐大模型的轮番上线&#xff0c;素人…

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

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

重新整理了新版JSON工具类和一些见解

封装好了&#xff0c;工具类&#xff0c;直接粘贴就好了:所需依赖 springboot&#xff0c;hutool package com.jmj.gulimall.product.utils;import cn.hutool.core.bean.BeanUtil; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annota…

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

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

一文读懂Java多线程并发之内存模型

什么是内存模型? Java内存模型(Java Memory Model)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚…

WHAT - HTTP keep-alive 持久性连接和内存泄漏问题

目录 一、介绍HTTP 持久性连接&#xff08;persistent connection&#xff09;实现细节示例持久性连接的优化管道化&#xff08;Pipelining&#xff09;HTTP/2 和 HTTP/3 二、Node.js HTTP Agent 开启 keepAlive 导致的内存泄漏问题Node.js HTTP Agent 和 Socket 池Keep-Alive …

聚焦 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…