关于复杂链表的复制问题(力扣)
创始人
2025-05-29 17:54:56

上面我们已经说了两个关于链表的实现了,其中一个是单链表,另外一个是双向带头循环链表,其中单链表在实际中其实并没有太大的作用,而真真有用的是双向循环带头链表,但是单链表的作用是什么?他可以充当复杂结构的子结构,例如(哈希桶)以后会说,下面我们说一下关于链表这一块的题,今天说的是关于复杂链表的复制

3f807503648d49599799eceb43b4aae8.png

这个是题目,可以先简单阅读一下,下面我会详细讲解这个题

我们可以看到的是,我们需要将这个链表复制一份出来,而这个链表的每个节点都有两个指针,一个是next节点,另外一个是random节点,该节点指向任意一个节点,也可能为空,所以我们要如何复制该链表。

首先我第一种思路,我们可以先把这些节点new出来,然后将next节点连好,然后我们可以记录原链表的random节点指向位置的相对位置,就例如原链表的第二个节点的random指向第一个节点,他和第一个几点的偏移量为0,所以他就指向第一个节点,可以让拷贝出来的第二个 节点也指向拷贝出来的第一个节点,这样每个节点都来一遍,就可以链接好,不过这个算法的时间复杂度太大,所以我们不能使用这种算法。

下面我在讲一个思路,这个思路我一边讲,一边画图,而我们所解决问题的思路也是这个,该算法可以达到O(n)的时间复杂度

下面我们就来看一下

301d079b578b448696f65d28f87f477a.png

首先我们可以看到原链表是这样子的,那么复制起来确实很麻烦,但是我们有一种全新的思路,我们可以将复制的节点链接在原节点的下一个我们可以看一下图片

 b228b8d150c5410894031c479cdeb16d.png

就是这样,这样就是复制结束后的样子,但是原链表的next的链接已经没了这里我忘记涂掉了,我们可以看一下这部分的代码

如何拷贝出来并且链接好

 21933132a2f44c3cb0bf615705ebca72.png

我们可以new一个节点然后让他的指和原节点的值相同,主要是我们需要记录愿链表的当前节点和下一个节点,这样我们就可以new出来后直接链接起来,然后我们在把next给给cur,直到cur为空我们才结束,所以当这段代码结束后就是图片上的样子。

下面我们在看下一步思路

 我们需要将拷贝的节点的random节点链接好。可以我们要如何连接

我们一边看图片一边说e256525321014a2d9883319fd800005e.png

拿13这个节点来说,我们13链接的节点就是他原节点random的next节点 ,我们可以看到就是这样,所以也是依次下去就可以链接好

我们可以看一下这部分的代码

7a330a3a5cc94f6cabfcdbc258161b29.png

我们把让cur指向头节点,这样我们在定义一个copy和next,只有当cur为空的时候才结束,这里我们就可以开始链接random节点了,当cur的next为空时,copy的next也为空,如果不为空的话就是copy的random就是cur的random的下一个节点,然后再把next给给cur让他迭代起来

放拷贝节点的random节点也链接好之后,我们就可以把拷贝节点和原链表分开,并且恢复原链表,所以我们可以把拷贝节点依次尾插,然后再恢复原链表,就像下面图片一样

deda8c78f99e4d6c9e5583a19a0d45f4.png 

6001de15724c40ba86d048ff5888fea5.png

 

这里将拷贝节点依次尾插好,并且把原列表恢复

下面我们看一下代码如何实现

ffd6733fa8774c5ab4c8d12185ba72d5.png

我们还是让cur指向头节点,然后再定义一个tail一个head不过这两个是拷贝节点的头尾,最后我们返回这里的头即可,我们还是定义copy和next然后让copy依次尾插,如果刚开始的head/tail为空的话,就把第一个copy节点给给head和tail,如果不为空就尾插,然后再让cur和next链接起来,就顺便恢复了原链表。

这里就分离结束,同时恢复了原链表

最后我们就

0c478dd9bfce4a4aa63eff5fcd8431ab.png 

这样就结束了,最后我把整个步骤都贴出来

fcf44ac6fa9a49c08ac8012143a6c018.png 

 

相关内容

热门资讯

Opentss代码测试 这是个多方门限签名库,使用rust实现。 代码包含两个功能,秘密共享密钥...
【id:14】【20分】C. ... 题目描述 编写一个函数比较两个字符串,参数是两个字符指针(要求显式定义...
无需公网IP,远程连接SQL ... 文章目录1.前言2.本地安装和设置SQL Server2.1 SQL Server下载2.2 SQL...
WuThreat身份安全云-T... 漏洞名称:CairoSVG 文件服务器端请求伪造 漏洞级别:严重 漏洞编号:CVE-2023-275...
Postgresql源码(10... 1 子事务控制语句分析 1.1 执行savepoint 执行函数: 【立即执行】→De...
python@日期和时间@da... 文章目录python datetimerelativedeltademo`timedelta...
数据库--进阶版-11--SQ... 1.插入数据 ·insert优化: 例如要插入下面这些 insert into tb_...
C语言—文件操作 为什么使用文件使用文件可以直接将数据存放到电脑硬盘上,做到数据的持久化什么是文件硬盘上...
【Zabbix_6.x 第三章... 文章目录👹 关于作者Zabbix 系列文章目录第三章 监控任意主机一、解决第二章登录...
python爬虫可以爬什么 Python爬虫可以爬取的东西有很多,Python爬虫怎么学?简单的分析...
组态王与200SMART之间无... 在实际的工业场合应用中,人机界面跟PLC配套使用是比较常见的现场“CP组合”ÿ...
KaiwuDB 荣获第三届 I... 3月17日,由中国某部电子化标准研究院、苏州金融科技协会、中国计算机用户协会指导&#x...
上海人工智能企业CIMCAI智... 上海人工智能企业CIMCAI智能港口自动化港口数字化码头智慧港航,成熟终端智慧港航人工...
红米note10 pro机型解... 前言。操作解除锁类案例只限于自己的机型, 因手机号长期不用或者忘记密码导致账号锁出现的...
9、Cascaded Diff... 简介 主页:https://cascaded-diffusion.github.io/...
异核通信框架(1)——SMP和... 0.前言         我是菜鸡,很久没有发表文章了。老样子,今天推荐...
Leetcode.2048 下... 题目链接 Leetcode.2048 下一个更大的数值平衡数 Rating : 17...
GBASE南大通用第二届校园大... 第二届校园大使在本周正式集结完毕啦! 全国一共有27所高校近50余名学生报名参加。 各...
Blender Apps?20... 2023 年对 Blender 来说将会是很有趣的一年,除了努力保持核心功能稳定和不断...
Python数据结构与算法(p... 学习材料清华大学博士讲解Python数据结构与算法 B站:https://www.bi...
Docker安装使用Nacos Docker安装使用Nacos1 参考2 Nacos版本2.1 访问地址3 Docker部署Naco...
Spring Boot 接口统... 需求 需求如题,想给一个 spring boot 项目的所有请求路径添加统一前缀&#x...
Boeing MQ-28 Gh... Boeing MQ-28 Ghost Bat作为五代机忠诚僚机的开山之作,今天我们来一...
线性动态规划问题 文章目录1. 三角形中最小路径之和2. 最长递增子序列3. 最长公共子序列 1. 三角形中最小路径之...
携手共赢!菊风荣获三基同创“2... 近年来智能手表市场发展势头迅猛,为满足用户多样化的应用场景,对于音视频能...
CentOS8提高篇3:Cen... 1. 准备工作(需要配置epel, rpmfusion源); 配置e...
计算机组成原理(7)--哈工大 程序中断方式中断的概念I/O中断的产生CPU和打印机部分并行工作程序中断方式的接口电路配置中断请求触...
Amazon S3 客户端:T... TntDrive 是适用于 Windows 的新 Amazon S3 客户端。使用 TntDrive...
java8 jdk1.8在wi... 一、软件下载 1、从网盘获取 java8安装包 2、或者从官网获取(需要提前注册ora...
【 Deep-Shallow ... A Deep-Shallow Fusion Network with Multi-Detail Ex...