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

在这里插入图片描述

文章目录

  • 💡题目分析
  • 💡解题思路
    • 🚩步骤一:拷贝节点插入到原节点的后面
      • 🍩步骤一代码
    • 🚩步骤二:控制拷贝节点的random进行连接
      • 🍩步骤二代码
    • 🚩步骤三:拷贝节点解下来尾插 组成拷贝链表,恢复原链表
      • 🍩步骤三代码
  • 🔔接口源码

在这里插入图片描述
题目链接👉 LeetCode 138.复制带随机指针的链表👈

💡题目分析

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

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

💡解题思路

🚩步骤一:拷贝节点插入到原节点的后面

🍄初始情况:
在这里插入图片描述

①先将链表拷贝一层,让头指针cur的next指向一个新创建的拷贝节点,并将拷贝节点的next指向cur没发生变化之前的next。即在每个节点的后面再插入一个与他相同的节点。
在这里插入图片描述
cur一直向后走,一直重复①步骤即可得到拷贝节点(图中米黄色线条)
在这里插入图片描述

🍩步骤一代码

	//1、拷贝节点插入在原节点的后面struct Node* cur = head;while(cur){struct Node* copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;struct Node* next = cur->next;//插入cur->next = copy;copy->next = next;cur = next;}

🚩步骤二:控制拷贝节点的random进行连接

②再将拷贝链表的random进行连接,由于原链表中每个节点的next都是拷贝链表中的节点,因此再将原链表中节点的random给拷贝链表的过程中,只需给random的next即可(copy->random = cur->random->next;)(图中紫色线条)
在这里插入图片描述

🍩步骤二代码

	//2、控制拷贝节点的randomcur = head;while(cur){struct Node* copy = cur->next;if(cur->random == NULL){copy->random = NULL;}else{copy->random = cur->random->next;}cur = copy->next;}

🚩步骤三:拷贝节点解下来尾插 组成拷贝链表,恢复原链表

③将拷贝出来的链表与原链表进行断开,即将拷贝节点的next指向原节点的next->next->next,即可完成断开。使拷贝链表的节点依次进行尾插,然后恢复原链表,返回拷贝节点的头即可(图中橙色线条)
在这里插入图片描述

🍩步骤三代码

	//3、拷贝节点解下来尾插组成拷贝链表,恢复原链表struct Node* copyHead = NULL;struct Node* copyTail = NULL;cur = head;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;}

🔔接口源码

struct Node* copyRandomList(struct Node* head) 
{//1、拷贝节点插入在原节点的后面struct Node* cur = head;while(cur){struct Node* copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;struct Node* next = cur->next;//插入cur->next = copy;copy->next = next;cur = next;}//2、控制拷贝节点的randomcur = 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、拷贝节点解下来尾插组成拷贝链表,恢复原链表struct Node* copyHead = NULL;struct Node* copyTail = NULL;cur = head;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;
}

在这里插入图片描述

🥰本道题目有一定的难度,希望烙铁们能够消化理解欧!

总结🥰
以上就是本题讲解的全部内容啦🥳🥳🥳🥳
本文章所在【C/C++刷题系列】专栏,感兴趣的烙铁可以订阅本专栏哦🥳🥳🥳
前途很远,也很暗,但是不要怕,不怕的人面前才有路。💕💕💕
小的会继续学习,继续努力带来更好的作品😊😊😊
创作写文不易,还多请各位大佬uu们多多支持哦🥰🥰🥰

请添加图片描述

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

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

相关文章

机器学习基础11-算法比较(基于印第安糖尿病Pima Indians 数据集)

比较不同算法的准确度,选择合适的算法,在处理机器学习的问题时是非常重要的。本节将介绍一种模式,在scikit-learn中可以利用它比较不同的算法,并选择合适的算法。你可以将这种模式作为自己的模板,来处理机器学习的问题…

ChatGPT在医疗系统的应用探索动态

注意:本信息仅供参考,发布该内容旨在传递更多信息的目的,并不意味着赞同其观点或证实其说法。 生成式人工智能,如OpenAI开发的ChatGPT,被认为是可以颠覆医疗行业的工具。尽管该技术刚刚起步,但已有许多医…

【分享】华为设备登录安全配置案例

微思网络www.xmws.cn,2002年成立,专业IT认证培训21年,面向全国招生! 微 信 号 咨 询: xmws-IT 华为HCIA试听课程:超级实用,华为VRP系统文件详解【视频教学】华为VRP系统文件详解 华为HCIA试听课…

Autosar存储入门系列03_Autosar中NVM状态机及存储调用逻辑

本文框架 0.前言1. NVM状态机介绍2. NVM读/写基本逻辑2.1 NVM读操作2.2 NVM写操作2.2.1 实时写2.2.2 下电写 2.3 NVM写入注意事项 0.前言 本系列是Autosar存储入门系列,希望能从学习者的角度把存储相关的知识点梳理一遍,这个过程中如果大家觉得有讲得不…

STM32--SPI通信与W25Q64(1)

文章目录 前言SPI通信硬件电路移位过程 SPI时序起始与终止条件交换一个字节 W25Q64硬件电路框图 FLASH操作注意事项软件SPI读写W25Q64 前言 USART串口链接入口 I2C通信链接入口 SPI通信 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串…

vscode远程调试PHP代码

目录 1.安装插件 2.ssh连接 3.Xdebug调试,访问 1.安装插件 1,下载phpDebug和Xdebug插件1 2,下载远程SSH插件 3,点击下面电脑小图标和ssh添加需要连接远程主机,我的vscode会在最上面显示需要连接的操作系统&#xf…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介,以及IOC注解 I…

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝,而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台,既要满足专业艺术作品展示的要求,又要提供深度思考的空间,这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…

2023年高教社杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…

ELK高级搜索(二)

文章目录 7.Java api 文档管理7.1 es技术特点7.2 获取数据7.3 文档查询7.4 文档新增7.5 文档修改7.6 文档删除7.7 文档bulk 8.图解es内部机制8.1 es分布式基础8.2 分片shard、副本replica8.3 单node环境创建index8.4 多node环境replica shard8.5 横向扩容…

strstr函数

目录 函数介绍: 函数分析: ​使用案例: 函数介绍: 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。 匹配过程不包括终止空字符,但它到此为止。 …

【Cortex-M3权威指南】学习笔记2 - 指令集

目录 指令集汇编语言基础UAL 近距离检视指令数据传输数据处理子程呼叫与无条件跳转指令标志位与条件转移指令隔离指令饱和运算 CM3 中新引入指令MRS\MSRIF-THENCBZ/CBNZSDIV/UDIVREV RBITSXTBTBB,TBH 指令集 汇编语言基础 一条简单的汇编指令格式(注释使用一个分号…

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。 本文总结了v23.1中针对DevExpress报表和BI Das…

远程调试环境配置

利用vscode的插件把远程连接调试php转化为本地调试php,通讯从php xdebug通讯变成vscode通讯 1.在vscode中安装插件 2.安装对应PHP版本的xdebug xdebug版本兼容参考https://xdebug.org/docs/compat#versions xdebug安装教程1https://blog.csdn.net/song634/article/…

核辐射对生物的影响

目录 1.什么是核辐射 2.核辐射的危害 3.核辐射对环境造成的影响 4.核辐射的影响会持续多长时间 1.什么是核辐射 核辐射是指自然界或人工产生的高能粒子或电磁波的放射性能量。当原子核不稳定时,会发生放射性衰变,释放出核辐射。 核辐射主要分为三种类…

免费图床配置:PicGo + Github + jsDelivr

免费图床配置:PicGo Github jsDelivr 前言PicGo Github配置过程jsdelivr加速踩坑注意事项参考资料 觉得文章有收获,欢迎关注公众号鼓励一下作者呀~ 在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号…

秒杀系统的业务流程以及优化方案(实现异步秒杀)

先看基本的业务流程 那么我们可以看到整个流程都是一个线程来完成的,这样的话耗时还是很长的,那么可不可以采用多线程去实现呢? 首先我们要思考怎么对业务进行拆分,可以想象一个我们去饭店点餐,会有前台接待&#xff…

【后端】Core框架版本和发布时间以及.net 6.0启动文件的结构

2023年,第35周,第1篇文章。给自己一个目标,然后坚持总会有收货,不信你试试! .NET Core 是一个跨平台的开源框架,用于构建现代化的应用程序。它在不同版本中有一些重要的区别和发布时间 目录 一、Core版本和…

爬虫:绕过5秒盾Cloudflare和DDoS-GUARD

本文章仅供技术研究参考&#xff0c;勿做它用&#xff01; 5秒盾的特点 <title>Just a moment...</title> 返回的页面中不是目标数据&#xff0c;而是包含上面的代码&#xff1a;Just a moment... 或者第一次打开网页的时候&#xff1a; 这几个特征就是被Cloud…

【QT】绘制旋转等待

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 程序中经常会遇到耗时的操作,需要提供等待的窗口,防止用户多次点击造成卡顿等问题。本文分享旋转等待技术,希望对各位小伙伴有所帮助!结果如下: