经典OJ题:随机链表的复制
目录
题目:
本题的解图关键在于画图与看图!
思路分析:
方法一:暴力求解法。
方法二:插入法
方法解析:
步骤一、插入
步骤二、 处理每一个copy的randdom指针⭐————重点
步骤三、拆卸节点
代码演示:

题目:
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
返回复制链表的头节点。
用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为null。
你的代码 只 接受原链表的头节点 head 作为传入参数。
- 题目大意:复制一个单链表,并返回一个单链表,需要复制的单链表,它的节点结构是有一个next指针和一个random指针,next指针和普通单链表的next指针一样,但是random指针是随机指向链表内部的任意节点,或者指向NULL。
- 现在我们要完美的复制一个这样的链表,并返回它。
题源:138. 随机链表的复制 - 力扣(LeetCode)

本题的解图关键在于画图与看图!
思路分析:
对于本题的关键是random指针的复制。
如何将每一个节点的random完完全全的,这是我们需要思考的问题,为此我们分为两种方法。
方法一:暴力求解法。
首先,将原链表A 完整的复制下来,当然,只是复制指针next和指针的数据。
而后,设立一个指针copy ,专门的对复制下来的链表B 进行遍历。
之后,再设置一个指针rand ,专门对原链表A进行遍历,并且对链表进行计数。
最后开始遍历,因为链表A和链表B的元素一样,所以我们再使用copy对链表B的random指向的时候,可以先使用指针rand,寻找相对因节点的rand指针指向的位置,并计数,然后将计数给指针copy,让其进行遍历。
而对于寻找相应节点的rand指针指向的位置是看节点中的数值是否一样。
缺点:如果使用了最坏的结果,所有random的指向都是尾节点位置,那么遍历之后,时间复杂度抵达了最高——O(N^2)
且,我们寻找对于节点的random指向是通过节点内的数值(元素),所以如果元素都一样,那就很难分别random要找的是那一个

方法二:插入法
我们再原链表的每一个节点后插入一个新的节点,通过节点和节点之间的联系完成random的指向复制操作,最后将每一个插入的新节点从原链表上拆除并重新组装在一起,返回最后的链表。

优点:这种方法解决了上面暴力解法的效率问题,上面的暴力解法因为拷贝的链表和原链表没有联系,所以需要遍历操作。
而这种方法使得拷贝的节点处在了原节点的后面,使得拷贝节点的一切数值和指针指针都可以模仿原节点操作,也就说数值可以复制,而随机指针可以变成源节点的随机指针的next。
方法解析:

步骤一、插入
再遍历中进行空间的开辟,并且利用遍历形成局部变量,方便之后的操作。
copy的next指向cur的next , 然后cur的next指向copy ,之后cur等于copy的next

这一步创建临时的局部变量copy空间,利用遍历将每一次遍历中创建的copy插入再原链表上。

步骤二、 处理每一个copy的randdom指针⭐
将上一步中的cur返回头节点,随后设立临时的局部指针copy 指向复制节点。
再对random进行复制之前,需要为random指向NULL的节点进行单独处理。
之后,将cur->random->next赋值与copy->random
再复制完毕后,将cur移动道copy->next的位置,也就是原链表的节点位置,而copy直接再一开始的位置设置为cur->next的位置上作为临时变量。

步骤三、拆卸节点
设置一个新的指针next,用来恢复原链表和作为临时变量使用
同时定义两个指针作为拆下来组装后的头节点和尾节点,newhead和newtail
再将cur指针返回头节点进行遍历和拆卸操作,同时设立copy指向复制节点
最后当然,需要注意,设立的newhead和newtail初始值是NULL,所以先要进行赋值,赋予copy的数值后再进行遍历拆卸的尾插操作。

代码演示:


相关文章:
经典OJ题:随机链表的复制
目录 题目: 本题的解图关键在于画图与看图! 思路分析: 方法一:暴力求解法。 方法二:插入法 方法解析: 步骤一、插入 步骤二、 处理每一个copy的randdom指针⭐————重点 步骤三、拆卸节点 代码…...
HTML的初步学习
HTML HTML 描述网页的骨架, 标签化的语言. HTML 的执行是浏览器的工作,浏览器会解析 html 的内容,根据里面的代码,往页面上放东西,浏览器的工作归根结底,还是以汇编的形式在CPU上执行. 浏览器对于html语法格式的检查没有很严格,即使你写的代码有一些不合规范之处,浏览器也会尽可…...
小赢科技荣登“2023中国互联网成长型前二十家企业”,旗下小赢卡贷表现突出
近日,中国互联网协会和厦门市人民政府联合在厦门举办了中国互联网企业综合实力指数(2023)发布会暨百家企业论坛。在这次评选活动中,深圳小赢信息技术有限责任公司(以下简称:小赢科技)凭借其行业领先的技术创新、企业成长及社会责任等方面的卓越表现,被评选为“2023年中国互联网…...
@Cacheable 、 @CachePut 、@CacheEvict 注解
在 Application 类上添加注解 EnableCaching EnableCaching public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}Cacheable 注解 能够让方法的返回值被缓存起来,后续的请求可以直接从缓存中获取结果。 示…...
【ChatGPT】人工智能的下一个前沿
🎊专栏【ChatGPT】 🌺每日一句:慢慢变好,我是,你也是 ⭐欢迎并且感谢大家指出我的问题 文章目录 一、引言 二、ChatGPT的工作原理 三、ChatGPT的主要特点 四、ChatGPT的应用场景 五、结论与展望 一、引言 随着人工智能技…...
chrome 一些详细信息查找的地方
可以获得chrome 信息的列表 缓存 #缓存位置# 浏览器事件...
小程序游戏对接广告收益微信小游戏抖音游戏软件
小程序游戏对接广告是一种常见的游戏开发模式,开发者可以通过在游戏中嵌入广告来获取收益。以下是一些与小程序游戏对接广告收益相关的关键信息: 小程序游戏广告平台选择: 选择适合你的小程序游戏的广告平台非常重要。不同的平台提供不同类型…...
将MSSQL字段类型由text改为ntext
-- 修改数据字段类型DECLARE DATATYPE nvarchar(128) SET DATATYPE (SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME your-table-name AND COLUMN_NAME your-column-name) IF DATATYPE text BEGIN-- 注意 text和ntext互转要先转为中间类型ALTER TABL…...
python怎么表示复数
Python是一种强大的编程语言,支持许多数据类型,其中包括复数。本文将介绍Python中如何表示复数。 一、什么是复数 复数是由实部和虚部组成的数,可以表示为abj,其中a是实部,b是虚部,j是虚数单位。 二、Py…...
Java设计模式之迭代器模式
定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 结构 迭代器模式主要包含以下角色: 抽象聚合角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。具体聚合角色:实现抽象聚合类&a…...
Qt 继承QAbstractListModel实现自定义ListModel
1.简介 QAbstractListModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似,它也是一个抽象类,提供了一些基本的接口和默认实现,可以方便地创建自定义的…...
TensorFlow2.0教程2-全连接神经网络以及深度学习技巧
文章目录 基础MLP网络1.回归任务2.分类任务mlp及深度学习常见技巧1.基础模型2.权重初始化3.激活函数4.优化器5.批正则化6.dropout基础MLP网络 1.回归任务 import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers# 导入数据 (x_t…...
【OpenCV】Mat矩阵解析 Mat类赋值,单/双/三通道 Mat赋值
文章目录 1 Mat (int rows, int cols, int type)2 Mat 的其他矩阵3 Mat 的常用属性方法4 成员变量5 Mat赋值5.1 Mat(int rows, int cols, int type, const Scalar& s)5.2 数组赋值 或直接赋值5.2.1 3*3 单通道 img5.2.2 3*3 双通道 img5.2.3 3*3 三通道 imgOpenCV Mat类详解…...
微服务之Nacos注册管理
文章目录 一、Nacos安装步骤1.安装地址2.安装版本3.目录说明4.端口配置5.启动 二、Nacos服务注册1.Nacos依赖2.客户端修改配置文件3.启动效果图4.总结 三、Nacos服务集群属性1.服务跨集群调用问题2.服务集群属性3.总结 四、Nacos根据集群负载均衡1.修改配置文件2.设置集群服务类…...
Spring boot集成sentinel限流服务
Sentinel集成文档 Sentinel控制台 Sentinel本身不支持持久化,项目通过下载源码改造后,将规则配置持久化进nacos中,sentinel重启后,配置不会丢失。 架构图: 改造步骤: 接着我们就要改造Sentinel的源码。…...
软件测试|测试方法论—边界值
边界值分析法是一种很实用的黑盒测试用例方法,它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充,测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现,Bug 往往出现在定义域或值域的边界上,而不…...
OceanBase 笔记
目录 1. OceanBase 笔记1.1. 命令行 1. OceanBase 笔记 1.1. 命令行 # -usysoraclet#obcluster # -u用户名租户名#集群名...
ubuntu, nvidia driver, cuda, cudnn, pytorch-gpu版本安装
文章目录 1.常用指令1.1查看cpu是intel还是amd:1.2.查看ubuntu版本1.3.查看架构1.4.查看已安装的nvidia驱动1.5.进入tty模式 2.安装ubuntu22.04 和 nvidia 驱动3.ubuntu 安装 anaconda4.安装pytorch gpu版本5.安装完整版cuda 和 cudnn6.nvidia-driver, cuda-toolkit, cudnn 1.常…...
探索环保葡萄酒之生物动力
根据生物动力农业和园艺协会的说法,生物动力农业是“一种精神-伦理-生态的农业、园艺、食品生产和营养方法。”生物动力农民将他们的农场或葡萄园视为一个坚固的有机体,一个自我维持的生态系统。这些农业哲学和实践在整个农业周期中应用了一种整体方法。…...
【线上问题】服务器关机导致docker启动的mysql数据库消失了
目录 一、问题描述二、解决方式 一、问题描述 1. 服务器迁移断电导致docker启动的mysql数据库没有了数据 2. data目录是空的 3. mysql重启数据库消失了 二、解决方式 1. sudo -i切换root账号 2. 查找mysql的容器卷 find /var/lib/docker/volumes/ -name mysql3. 进入各个_dat…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
