复杂链表的复制

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

    /*public class RandomListNode {int label;RandomListNode next = null;RandomListNode random = null;RandomListNode(int label) {this.label = label;}}*/public class Solution {public RandomListNode Clone(RandomListNode pHead){if(pHead == null) {return null;}RandomListNode currentNode = pHead;//1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;while(currentNode != null){RandomListNode cloneNode = new RandomListNode(currentNode.label);RandomListNode nextNode = currentNode.next;currentNode.next = cloneNode;cloneNode.next = nextNode;currentNode = nextNode;}currentNode = pHead;//2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;while(currentNode != null) {currentNode.next.random = currentNode.random==null?null:currentNode.random.next;currentNode = currentNode.next.next;}//3、拆分链表,将链表拆分为原链表和复制后的链表currentNode = pHead;RandomListNode pCloneHead = pHead.next;while(currentNode != null) {RandomListNode cloneNode = currentNode.next;currentNode.next = cloneNode.next;cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;currentNode = currentNode.next;}return pCloneHead;}}

解题思路:在原链表的基础上在每个节点后面复制一个相同节点,然后在把链表拆分;

假设有下面这样一条链表:

第一步将phead节点复制给currentNode(为什么不在直接使用phead呢?因为,我们第二轮遍历的时候又得从头节点开始,所以我们得保留);

判断currentNode不等于null,开始复制;创建一个复制节点cloneNode并且给它一个当前结点的值,并将currenNode的下一个节点指向它,而原先currentNode的下一个节点现在就是下下一个节点了;就这样一直复制;

结束循环之后:

现在进入到第二个循环将 老节点的随机结点赋给新结点( currentNode = pHead就表现出它的作用了,从头节点有开始遍历):

进入判断,不为空的之后,将当前节点的随机结点的下一个结点赋值给它(cloneNode.next==null?null:cloneNode.next.next),这里要理解,相当于A'的随机节点是C'(这道题最大的难度就在这里),然后循环赋值完毕:

现在开始拆分链表 ,拆分表我感觉太简单了,就没必要细讲了,可以看懂的.

总结:这道题主要还是要考虑随机指向这个问题,所以采用了这种链表分身赋值的方式解决.简单容易理解.

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

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

相关文章

在Ubuntu Linux上安装Chrome浏览器的最佳方法

我们可以使用GUI和命令行方法在Ubuntu Linux上安装Google Chrome浏览器,但是,终端是配置Chrome浏览器的最佳方式。在这里,我们讨论如何使用它。 有数十种浏览器,甚至Linux系统如Ubuntu也带有自己的默认浏览器Mozilla Firefox。然…

电磁波的波长与频率是什么关系?

摘要: 电磁波的波长(λ)与频率(f)之间的关系可以通过以下公式来表示: f c/λ cλf 其中: c 是光速,即电磁波在真空中的传播速度,约为 3 x 10⁸ 米/秒(m/s)λ…

2024.1.26每日一题

LeetCode 边权重均等查询 2846. 边权重均等查询 - 力扣(LeetCode) 题目描述 现有一棵由 n 个节点组成的无向树,节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ui, vi,…

三方jar包引入到springboot中 package到jar中正常启动的pom文件怎么写 IDEA

文章目录 场景例子工程引用pom文件(打包关键)打包后观察 场景 许多时候我们在对接三方的时候,需要下载官方的推荐的SDK,但springboot项目怎么引入额外的三方jar包了,自已通过maven本地坐标的方式尝也不行,…

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展,全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

商业标书制作的艺术与科学

在商业世界中,标书不仅是一份文件,它是企业实力和专业精神的体现,是通往成功竞标的敲门砖。制作一份出色的商业标书,就像是在精心策划一场演出,每一个细节都至关重要。今天,就让我们一起探索商业标书制作流…

数据库系统原理总结之——目录

数据库系统原理总结之——目录 资料说明:主要是对数据库系统原理总结,发布的各个章节总结一个目录方便查看和查找 第一章数据库系统概述 第二章 关系数据库 第三章 数据库设计 第四章 SQL 与关系数据库基本操作 第五章 数据库编程 第六章 数据库安…

PageHelper分页插件-以三层架构模型开发为例

文章目录 1、简介2、使用2.1、导入2.1.1、SpringBoot2.1.2、非SpringBoot 2.2、controller2.3、service2.4、mapper ​🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、…

智能小程序事件系统——基础交互事件介绍

什么是交互事件 事件是视图层到逻辑层的通讯方式。事件可以将用户的行为反馈到逻辑层进行处理。事件可以绑定在组件上。当达到触发事件,就会执行逻辑层中对应的事件处理函数。事件对象可以携带额外信息,如 id、dataset 和 touches。 事件分类 事件分为…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中,用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

25从零开始用Rust编写nginx,序列化之serde是如何工作的

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 项目地址 国内: https:…

SQL字符串截取函数【简笔记】

MySQL提供了多种字符串函数来处理和截取字符串。下面是一些常用的字符串截取函数及其使用示范: SUBSTRING(str, pos, len) str 是要截取的字符串。pos 是开始截取的位置。len 是截取的长度。 示例: SELECT SUBSTRING(Hello, World!, 8, 5); -- 结果: "World…

实验一:FIRST集

前置知识 1.vector基本操作https://c.biancheng.net/view/6749.html2.set基本操作https://c.biancheng.net/view/7196.html 核心操作 //G文法结构体 struct G {int Vt_number;int Vn_number;int P_number;set<char> Vt;set<char> Vn;char S;vector<string>…

ConcurrentHashMap详解

ConcurrentHashMap详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;在今天的文章中&#xff0c;我们将深入探讨Java中的一个重要类——ConcurrentHashMap。这是一个在多线程环境下高效操作的线程安全的哈希表&#xff0c;让我们…

ERD Online:数据建模与元数据管理的未来

ERD Online&#xff1a;数据建模与元数据管理的未来&#x1f31f; 在数字化时代&#xff0c;数据是企业的核心资产。如何高效、安全地管理这些数据成为企业面临的一大挑战。今天&#xff0c;我要介绍的这个平台&#xff0c;可能是你正在寻找的解决方案——它就是 ERD Online&am…

企业级大数据安全架构(六)数据授权和审计管理

作者&#xff1a;楼高 本节详细介绍企业级大数据架构中的第六部分&#xff0c;数据授权和审计管理 1.Ranger简介 Apache Ranger是一款被设计成全面掌管Hadoop生态系统的数据安全管理框架&#xff0c;为Hadoop生态系统众多组件提供一个统一的数据授权和管理界面&#xff0c; 管…

怎么创建facebook广告

创建Facebook广告的文章应由本人根据自身实际情况书写&#xff0c;以下仅供参考&#xff0c;请您根据自身实际情况撰写。 创建Facebook广告的步骤&#xff1a; 确定目标受众和广告主题&#xff1a;首先需要明确你的目标受众是谁&#xff0c;他们有什么特点&#xff0c;以及你想…

蓝桥杯2024/1/28----十二届省赛题笔记

题目要求&#xff1a; 2、 竞赛板配置要求 2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。 2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。 2.3扩展方式跳线 J13 配置为 IO 模式。 2.4 请注意 &#xff1a; 选手需严格按照以上要求配置竞赛板&#xff0c;编写和调…

APT32F1023X 发送RF433处理

1.硬件电路--CMT2110A 需要注意&#xff1a;发射端MCU写数据的频率要匹配&#xff0c;如果MCU发送中时间最小脉宽是1MS&#xff0c;那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…

Matlab基础语法

基础语法 %% Matlab基本的小常识 % (1)在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子&#xff1b;)表示不显示运行结果 a 3; a 5% (2)多行注释:选中要注释的若干语句,快捷键CtrlR % a 3; % a 5% (3)取消注释:选中要取消注释的语句,快捷键CtrlT % 我想要取…