【链表OJ 11】复制带随机指针的链表

前言: 

💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥

✨✨刷题专栏:http://t.csdn.cn/UlvTc

⛳⛳本篇内容:力扣上链表OJ题目

目录

leetcode138. 复制带随机指针的链表

1. 问题描述

2.代码思路:

2.1拷贝节点插入到原节点的后面

2.2控制拷贝节点的random    

2.3拷贝节点解下来尾插组成拷贝链表,恢复原链表


leetcode138. 复制带随机指针的链表

来源:138. 复制带随机指针的链表 - 力扣(LeetCode)

1. 问题描述

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

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

应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

题解接口: 

struct Node* copyRandomList(struct Node* head) {}

2.代码思路:

2.1拷贝节点插入到原节点的后面

        复制节点:遍历原链表,对于每个节点,创建一个副本节点,并将其插入到原节点的后面。

我们一步一步分解来做,首先malloc一个新的节点,然后让copy指针接收,让原链表第一个节点里面的val值赋值给新malloc出来的链表。

        最后记得将cur=next,让cur指向next,循环条件是cur不为NULL,再次回到循环,重复①②③④⑤⑥⑦的步骤

        这是链表的最后情况。 

2.2控制拷贝节点的random    

  • 设置random指针:遍历链表,对于每个原节点,设置对应副本节点的random指针。
  1. 如果原节点的random指针为NULL,则副本节点的random指针也设置为NULL
  2. 否则,副本节点的random指针设置为原节点的random指针指向的节点的副本节点。

分解动作:

①把cur指针重新指向原链表头节点(head

②进入while循环,条件是cur不为NULL,定义一个新指针copy然后让其指向新组成的链表头节点的下一个节点cur->next      

③     如果原链表的random域指向的地址为NULL,那么新节点的random域指向NULL

         如果原链表的random域指向的地址不为NULL,那么此时将此时cur->random->next的地址赋值给新节点的copy->random

④将copy->next赋值给cur

循环①②③④步,结束条件是cur指向NULL

这是最终情况.

2.3拷贝节点解下来尾插组成拷贝链表,恢复原链表

        分离链表:遍历合并后的链表,将链表分离为原链表副本链表。同时,恢复原链表的next指针,使其指向原链表的下一个节点;同时,构建副本链表,通过尾插法将副本节点依次添加到副本链表的末尾。

尾插:

恢复链表

         循环条件依然是cur不为NULL,当cur指向NULL,循环结束直接返回副本链表的头节点copyHead

代码实现:

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,*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;
}

执行:

        文章讲解到此结束,如有错误,欢迎指正 感谢支持!

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

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

相关文章

【LeetCode】328. 奇偶链表

328. 奇偶链表(中等) 思路 如果链表为空,则直接返回链表。 对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶…

Unity AssetBundle(1):Assets打包和依赖(Dependencies)

对Unity5.x后的AssetBundle依赖机制有了一点理解,创建了一个项目验证 github:GeWenL / AssetBundlePro AbScene.unity 资源有哪些? Some common types of Asset assetbundle打包命令是 BuildPipeline.BuildAssetBundles ,格式有: 引用&…

基于JavaScript粒子流动效果

这是一个HTML文件,主要包含了一些CSS样式和JavaScript代码,用于创建一个动画效果。 在CSS部分,定义了一些基本的样式,包括页面的背景颜色、位置、大小等。特别的,定义了两种球形元素(.ball_A 和 .ball_B&am…

windows10默认浏览器总是自动更改为Edge浏览器

在设置的默认应用设置中把默认浏览器改为chrome或其他之后他自动又会改回Edge。不得不说*软真的狗。 解决办法: 后来发现在Edge浏览器的设置中有这么一个选项,会很无耻的默认是Edge。把它关掉后重新设置就行了。

Ceph BlueStore 和双写问题

论开源分布式存储,Ceph大名鼎鼎。用同一个存储池融合提供块存储、对象存储、集群文件系统。在国内有近年使用量迅速攀升。 大型公司内部研发云虚拟化平台,常使用开源方案Openstack或者Kubernetes,配套的为虚机或容器提供块存储的开源方案&am…

CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 隐藏元素但保留占位空间⭐ display: none;⭐ visibility: hidden;⭐ 总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…

CSAPP的Lab学习——BombLab

文章目录 前言一、一号炸弹(小试牛刀)二、二号炸弹(六重循环)三、三号炸弹(不同输入,不同答案)四、四号炸弹(判断语句的实现)五、五号炸弹(跳转,循…

CSS3常用的新功能总结

CSS3常用的新功能包括圆角、阴渐变、2D变换、3D旋转、动画、viewpor和媒体查询。 圆角、阴影 border-redius 对一个元素实现圆角效果,是通过border-redius完成的。属性为两种方式: 一个属性值,表示设置所有四个角的半径为相同值&#xff…

【javaweb】学习日记Day9 - Mybatis 基础操作

目录 一、删除 (1)在mapper接口执行sql删除语句 ① 注解后sql语句没有提示怎么办? (2)测试层 (3)开启mybatis日志 (4)预编译SQL 二、新增 (1&#…

C#添加WebApi,配置Swagger

1、创建一个WebAPI项目 下载、安装、引入【Swashbuckle.AspNetCore】包 右击【解决方案】,然后点击【管理Nuget包】,搜索【Swashbuckle.AspNetCore】包 2、配置Swagger中间件 在【Startup.cs】文件中的【ConfigureService】类中添加如下代码。 在【Sta…

如何取消KEIL-MDK工程中出现的CMSIS绿色图标

如何取消KEIL-MDK工程中出现的CMSIS绿色图标?我以前经常遇到,不知道怎么搞,好像也不影响编译结果。以前问过其他人,但是不知道怎么搞,相信很多人也遇到过。水平有限,表达不清楚,见下图&#xff…

WebGL模型矩阵

前言:依赖矩阵库 WebGL矩阵变换库_山楂树の的博客-CSDN博客 先平移,后旋转的模型变换: 1.将三角形沿着X轴平移一段距离。 2.在此基础上,旋转三角形。 先写下第1条(平移操作)中的坐标方程式。 等式1&am…

怎样将几个pdf合并?

在日常工作中,我们经常需要处理大量的PDF文件。有时候,我们需要将多个PDF文件合并成一个文件,以便于快速传输或方便查阅。虽然PDF文件本身不能进行编辑,但是借助专业的PDF编辑软件,我们可以轻松地实现将多个PDF文件合并…

集成facebook第三方登录facebook_client_token不知道在哪

在应用面板的应用设置中 选择高级 下拉一些,客户端口令这个就是了 再加到string 中

idea 链接mysql连不上

打开文件 C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\jbr\conf\security\java.security修改内容 搜索:jdk.tls.disabledAlgorithms 修改 链接地址 在链接后面添加 ?useSSLfalse jdbc:mysql://127.0.0.1:3306/db_admin3?useSSLfalse

【NLP的python库(02/4) 】:Spacy

一、说明 借助 Spacy,一个复杂的 NLP 库,可以使用用于各种 NLP 任务的不同训练模型。从标记化到词性标记再到实体识别,Spacy 还生成了精心设计的 Python 数据结构和强大的可视化效果。最重要的是,可以加载和微调不同的语言模型以适…

服务端请求伪造(SSRF)及漏洞复现

文章目录 渗透测试漏洞原理服务端请求伪造1. SSRF 概述1.1 SSRF 场景1.1.1 PHP 实现 1.2 SSRF 原理1.3 SSRF 危害 2. SSRF 攻防2.1 SSRF 利用2.1.1 文件访问2.1.2 端口扫描2.1.3 读取本地文件2.1.4 内网应用指纹识别2.1.5 攻击内网Web应用 2.2 SSRF 经典案例2.2.1 访问页面2.2.…

Effective Java(中文版第3版)第2条:遇到多个构造器参数时要考虑使用构建器

Effective Java(中文版第3版)第2条:遇到多个构造器参数时要考虑使用构建器

Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误

作者:DAVID HOPE 本博客介绍了 Elasticsearch 相关性引擎 (ESRE​​) 及其 Elastic Learned Sparse Encoder 功能的新颖应用,特别是在日志分析中。 最近发布的 Elasticsearch Relevance Engine™ (ESRE™) 包含一系列重要功能,可增强搜索能力…

Linux的服务器日志分析及性能调优

作为网络安全和数据传输的重要环节,代理服务器在现代互联网中扮演着至关重要的角色。然而,在高负载情况下,代理服务器可能面临性能瓶颈和效率问题。本文将介绍如何利用Linux系统对代理服务器进行日志分析,并提供一些实用技巧来优化…