当前位置: 首页 > news >正文

力扣138:随机链表的复制

力扣138:随机链表的复制

题目描述:

给你一个长度为 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 作为传入参数。

示例 1:
在这里插入图片描述

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

在这里插入图片描述

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

在这里插入图片描述

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

提示:

0 <= n <= 1000
-104 <= Node.val <= 104
Node.random 为 null 或指向链表中的节点。

分析:

这道题的意思是对一个 含有随机指针的单链表进行复制,也就是说,复制之后也是一个完全一样的含有随机指针的单链表。原来单链表中每个节点的随机指针指向的节点,在复制之后,依然 也得是一样的。

对于这道题,三步走:

  • 第一步 拷贝节点在原节点后面:

将原链表中每个节点依次拷贝一份,并插入到对应节点后面。在遍历原链表时,cur用于记录原链表中当前节点。动态开辟一个copy节点,用于存储拷贝的节点。

在插入时,先执行copy->next=cur->next;再执行cur->next=copy

在这里插入图片描述

完成依次拷贝并插入到对应节点后,将cur后移。这里的后移是在原链表上后移动,但是原链表的第一个节点在后面插了一个节点,因此cur一个需要移动两个节点,即cur=cur->next->next或者cur=copy->next

在这里插入图片描述

什么时候遍历结束呢?

当前指针cur为空时,表示原来的链表遍历结束。
在这里插入图片描述

  • 第二步:处理拷贝节点copy的random

原来链表的每个节点都有一个随机指针,因此在复制的时候,也要将随机指针赋值到拷贝的链表中。

以下面这个情况为例:
在这里插入图片描述
可以看到,第一个节点7的随机指针指向的是NULL,第二个节点13的随机指针指向的是第一个节点7,第三个节点11的随机指针指向的是第五个节点1…

当原链表节点的随机指针指向NULL时,那么我们对应的拷贝节点的随机指针也指向NULL,即copy->random=NULL

在这里插入图片描述

当原链表节点的随机指针指向另外一个节点时,可以使对应的拷贝节点copy指向当前节点cur随机节点指向的节点的下一个节点,即copy->random=cur->random->next,这一步是整个代码的灵魂,这里可能有点绕,结合下图去分析:

在这里插入图片描述

当前指针cur为空时,遍历结束。

  • 第三步:拷贝节点copy解下来尾插:

这一步,主要使用是单链表中尾插操作。

需要先创建一个新的头指针和尾指针,当尾指针为空时,也就是说新链表里面还没有节点时,此时插入的节点就是这个新链表的头节点

遍历链表,当前指针cur为空时,遍历结束

拷贝指针copy所指向的节点,需要尾插到新链表里面,copy指针即copy=cur->next,实现尾插:tail->next=copy

将拷贝节点解下来后,还需要将原链表复原,因此,需要创建一个next指针指向copy->next,next也就是原链表的下一个节点。补原链表,cur->next=next

cur移动到next位置,继续执行上述操作,直到cur为空

最后只需要返回新链表的头节点,即拷贝后的链表。

代码:

/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/struct Node* copyRandomList(struct Node* head) {struct Node*cur=head;while(cur){struct Node*copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;copy->next=cur->next;cur->next=copy;cur=cur->next->next;}cur=head;while(cur){struct Node*copy=cur->next;if(cur->random==NULL){copy->random=NULL;}else{copy->random=cur->random->next;}cur=cur->next->next;}struct Node* newhead=NULL,*tail=NULL;cur=head;while(cur){struct Node*copy=cur->next;struct Node*next=copy->next;if(tail==NULL){newhead=tail=copy;}else{tail->next=copy;tail=tail->next;}cur->next=next;cur=next;}return newhead;
}

相关文章:

力扣138:随机链表的复制

力扣138&#xff1a;随机链表的复制 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…...

C语言左移与右移学习

在学习左移与右移之前&#xff0c;我们首先要学习两种移位运算&#xff1a;逻辑移位和算数移位。 逻辑位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用0补充。 算数位移&#xff1a;移出去的位丢弃&#xff0c;空缺位用符号位补充。 左移 左移是高位溢出&#xff0c;低…...

asp.net core mvc之 视图

一、在控制器中找到匹配视图&#xff0c;然后渲染成 HTML 代码返回给用户 public class HomeController : Controller {public IActionResult Index(){return View(); //默认找 Views/Home/Index.cshtml &#xff0c;呈现给用户} &#xff5d; 二、指定视图 1、控制器 publ…...

ChatGLM3 tool_registry.py 代码解析

ChatGLM3 tool_registry.py 代码解析 0. 背景1. tool_registry.py 0. 背景 学习 ChatGLM3 的项目内容&#xff0c;过程中使用 AI 代码工具&#xff0c;对代码进行解释&#xff0c;帮助自己快速理解代码。这篇文章记录 ChatGLM3 tool_registry.py 的代码解析内容。 1. tool_re…...

js实现定时刷新,并设置定时器上限

定时器 在js中&#xff0c;有两种定时器&#xff1a; 倒计时定时器 倒计时定时器&#xff0c;也叫延时定时器或一次性定时器 功能&#xff1a;倒计时多长时间后执行某个动作 语法&#xff1a;setTimeout(function, timeout); 返回值&#xff1a;int类型&#xff0c;当前定时器…...

常用Linux命令

df -h #查看磁盘 kill -9 pid #强制关闭程序 ifconfig #查看网卡信息 last …...

【C++】获取指定点所在屏幕的尺寸

问题 多个显示器时&#xff0c;获取指定点所在的显示器的尺寸。 分析 之前整理过获取屏幕尺寸的方法&#xff1a;https://blog.csdn.net/m0_43605481/article/details/125024500多显示器时&#xff0c;需要用到GetSystemMetrics、EnumDisplayDevices、EnumDisplaySettings函…...

软文发布如何选择对应的媒体

企业做软文推广第一步&#xff0c;就是选择合适的媒体进行投放&#xff0c;然而许多企业不知道如何选择合适的媒体导致推广工作十分被动&#xff0c;无法取得效果&#xff0c;今天媒介盒子就来和大家分享&#xff0c;企业应该如何选择对应的媒体。 一、 媒体类型 根据软文类型…...

Django如何创建表关系,Django的请求声明周期流程图

【1】表与表之间的关系 一对一 左表的一条记录对应右表的一条记录&#xff0c;反之亦然 多对一 左表的一条记录对应右表的多条记录&#xff0c;反之不成立 多对多 左表的一条记录对应右表的多表记录&#xff0c;反之成立 【2】django中创建表关系 class Book(models.Model):t…...

微服务-我对Spring Clound的理解

官网&#xff1a;https://spring.io/projects/spring-cloud 官方说法&#xff1a;Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…...

安防监控EasyCVR视频汇聚平台无法接入Ehome5.0是什么原因?该如何解决?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放…...

机器学习——逻辑回归

目录 一、分类问题 监督学习的最主要类型 二分类 多分类 二、Sigmoid函数 三、逻辑回归求解 代价函数推导过程&#xff08;极大似然估计&#xff09;&#xff1a; 交叉熵损失函数 逻辑回归的代价函数 代价函数最小化——梯度下降&#xff1a; ​编辑 正则化 四、逻辑…...

自动驾驶学习笔记(七)——感知融合

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知融合 卡尔曼滤波 融合策略 实…...

【Java0基础学Java第八颗】 -- 继承与多态 -- 多态

8.继承与多态 8.2 多态8.2.1 多态的概念8.2.2 多态实现条件8.2.3 重写8.2.4 向上转型和向下转型8.2.5 向下转型8.2.6 多态的优缺点8.2.7 避免在构造方法中调用重写的方法 8.2 多态 8.2.1 多态的概念 通俗来说就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当…...

玩转ansible之参数调试和文件操作篇

更多IT技术文章&#xff0c;欢迎关注微信公众号“运维之美” 玩转ansible之参数调试和文件操作篇 01 剧本调试和帮助02 使用场景举例 上节我们学习了使用ansible进行软件安装&#xff0c;那么安装完软件后&#xff0c;就需要linux系统和软件配置修改了&#xff0c;对于linux主机…...

JVM虚拟机:垃圾回收器之Parallel Old(老年代)

本文重点 本文将学习老年代的另外一种垃圾回收器Parallel Old(PO)&#xff0c;这是一种用于老年代的并行化垃圾回收器&#xff0c;它使用标记整理算法进行垃圾回收。 历史 在1.6之前&#xff0c;新生代使用Parallel Scavenge只能搭配老年代的Serial Old收集器&#xff0c;而…...

Stream流的groupingBy

Stream流的groupingBy 简单使用 业务场景&#xff1a;现在有100个人&#xff0c;这些人都年龄分部在18-30岁之间。现要求把他们按照年龄进行分组 key&#xff1a;年龄 value&#xff1a;数据列表 public void listToMapGroup() {//这里假设通过listStreamService.list();方法…...

如何在不结束tcpdump的情况下复制完整的pcap

tcpdump正在运行的时候&#xff0c;他写入的pcap可能是不完整的&#xff0c;通常我们要结束掉tcpdump才能拿到完整的pcap&#xff0c;否则wireshark打开的时候会提示&#xff1a;The capture file appears to have been cut short in the middle of a packet。这可能是因为tcpd…...

maven POM文件总体配置说明

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父项目的坐…...

49.批处理命令(1/2)

目录 一批处理。 &#xff08;1&#xff09;批处理定义。 &#xff08;2&#xff09;常见命令。 &#xff08;2.1&#xff09;rem和:: &#xff08;2.2&#xff09;echo和。 &#xff08;2.3&#xff09;pause。 &#xff08;2.4&#xff09;errorlevel。 &#xff08;…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...