【数据结构】链表OJ面试题5《链表的深度拷贝》(题库+解析)

1.前言 

前五题在这http://t.csdnimg.cn/UeggB

后三题在这http://t.csdnimg.cn/gbohQ

给定一个链表,判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 

给定一个链表,返回链表开始入环的第一个结点。 如果链表无环,则返回 NULLhttp://t.csdnimg.cn/pbFiK

记录每天的刷题,继续坚持!

2.OJ题目训练

11. 给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点。 要求返回这个链表的深度拷贝。力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目分析

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

这道题第一次做还是会有点理解的...但其实也不复杂

其实就是,一个正常的单链表,但是有数据位,也能有指向下一个节点位,但是多出来一个指针会随机指向此链表的如何一个节点,而我们就要对他进行一个复制。复制单链表简单,但是我们要注意,这里还增加了一个额外的指针。而且我们复制的时候随机指针还是要指向原本对应的节点。

比如:下面的d1的随机指针指向了d3,而我们新的d1节点就要指向新的d3节点

若我们直接暴力复制原链表的所有值,就会发生这种错误情况

所以此题不能暴力求解。

方法

1.首先先把拷贝节点放在每个原节点后面,这样子就可以很好的查找各节点的random

2.置每个拷贝的节点random,因为我们可以依据相对位置找到原节点的random,再让他赋值

copy->random = cur->random->next       //拷贝random节点的关键代码

3.收尾工作:拷贝的节点和原节点分开,恢复原链表。

附源代码

/*** 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));struct Node* Next = cur->next;copy->val = cur->val;//插入copycur->next = copy;copy->next = Next;//往后走     cur = Next;}//重新开始走,因为random的特殊性//所以在copy节点没有全部创造出来还不能添加cur = head;while(cur){   struct Node* copy = cur->next;//置 copy randomif(cur->random == NULL) //考虑其中一种为0的情况,如果为NULL访问就会报错{copy->random = NULL;}else{copy->random = cur->random->next;} cur = copy->next;}//分割链表cur = head;struct Node* copyhead = NULL,*copytail = NULL;while(cur){struct Node* copy = cur->next;struct Node* next = cur->next->next;if(copytail == NULL){copyhead = copytail = copy;}else{copytail->next = copy;copytail = copytail->next;} cur->next = next;cur = next;}return copyhead;
}

12. 其他 。ps:链表的题当前因为难度及知识面等等原因还不适合我们当前学习,可以自行练习。

力扣

牛客网在线编程_算法篇_面试必刷TOP101

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

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

相关文章

面向对象2:继承

目录 2.1继承 2.2 继承的好处 2.3 权限修饰符 2.4 单继承、Object 2.5 方法重写 2.6 子类中访问成员的特点 2.7 子类中访问构造器的特点 面向对象1:静态 2.1继承 向对象编程之所以能够能够被广大开发者认可,有一个非常重要的原因,是…

Qt 软件封装与打包

1. Qt 软件封装 1、首先以 release 方式进行编译,将生成的 CloudOne.exe 文件复制到 D:\CloudApp 文件夹(自行创建) 2、打开 Qt 命令行工具(如下图所示),并按顺序输入如下指令 cd D:\CloudApp windeployq…

linux应用 进程间通信之共享内存(POSIX)

1、前言 1.1 定义 POSIX共享内存是一种在UNIX和类UNIX系统上可用的进程间通信机制。它允许多个进程共享同一块内存区域,从而可以在这块共享内存上进行读写操作。 1.2 应用场景 POSIX共享内存适用于需要高效地进行大量数据交换的场景,比如多个进程需要…

【JavaEE】----SpringBoot的创建和使用

目录 1.Spring与SpringBoot的区别(面试) 2. SpringBoot的创建 3.SpringBoot创建时的问题及解决 4.SpringBoot的目录学习 5.创建一个SpringBoot 项目并且启动 1.Spring与SpringBoot的区别(面试) Spring 的诞⽣是为了简化 Java 程…

2023年全国职业院校技能大赛软件测试赛题第5套

2023年全国职业院校技能大赛 软件测试赛题第5套 赛项名称: 软件测试 英文名称: Software Testing 赛项编号: GZ034 归属产业: 电子与信息大类 …

如何生成狗血短剧

如何生成狗血短剧 狗血短剧剧本将上述剧本转成对话 狗血短剧剧本 标题:《爱的轮回》 类型:现代都市爱情短剧 角色: 1. 林晓雪 - 女,25岁,职场小白,善良单纯 2. 陆子轩 - 男,28岁,公…

内网穿透 | 推荐两个免费的内网穿透工具

目录 1、简介 2、Ngrok 2.1、下载安装 2.2、运行 2.3、固定域名 2.4、配置多服务 3、cpolar 3.1、下载安装 3.2、运行 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应…

【每日一题】尾随零

尾随零 目录 思路:代码实现: 思路: 最开始看到这题就只想到规规矩矩的做题,先算阶乘在算0,后来提交时总是提示溢出,不死心,改来改去最后没招了。 后来看题解才知道要看5的个数! …

【AI视野·今日CV 计算机视觉论文速览 291期】Wed, 17 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Wed, 17 Jan 2024 Totally 182 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers MultiPLY: A Multisensory Object-Centric Embodied Large Language Model in 3D World Authors Yining Hong, Zishuo Zhe…

【每日一题】牛客网——链表的回文结构

✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果,视频制作者可能会采用动态水印的方式,让其他人难以盗取视频使用。动态水印的添加,需要应用到运动路径功能。接下来,本文会教大家动态水印怎么加,怎么去除动态水印的相关内容。感兴趣的小…

对进程与线程的理解

目录 1、进程/任务(Process/Task) 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理(Memory Manage) 4、线程(Thread)…