[LeetCode]-138. 随机链表的复制

目录

 题目

解题步骤

1.拷贝节点插入原节点的后面

2.置每个拷贝节点random

3.拷贝节点解下来,尾插到一起,恢复原链表

完整代码


 题目

给你一个长度为 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.拷贝节点插入原节点的后面

给原链表的每个节点都拷贝一份,其中每个新节点的值都设为其对应的原节点的值,将新节点都分别插入到原节点的后面,组成了一个新链表。

如下图:

 代码

struct Node* copyRandomList(struct Node* head) {struct Node* cur=head;while(cur){//拷贝节点struct Node* next=cur->next;struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;//插入cur->next=copy;copy->next=next;//往后走cur=next;}

2.置每个拷贝节点random

由于新链表节点上的random指向状态要和原链表节点上的相同,因此原节点后面的拷贝出来的节点的random指向的节点应该是原节点random指向节点的后面拷贝节点,置每个拷贝节点random可以用copy->random=cur->random->next,(原节点random置空时除外,此时拷贝节点random也置空)。

如下图:

代码

cur=head;
while(cur)
{struct Node* copy=cur->next;//置copy->randomif(cur->random==NULL)copy->random=NULL;elsecopy->random=cur->random->next;cur=copy->next;
}

3.拷贝节点解下来,尾插到一起,恢复原链表

接下来就是单链表的节点的删除和尾插的内容了,先创建一个拷贝拷贝链表的头copyhead,创建copytail用于保存解下的拷贝节点,创建copy用来遍历解开拷贝的节点,创建单链表删除节点时需要的两边节点cur、next,随着拷贝节点向后遍历,cur和next一起到null时结束遍历。

如下图:

代码

cur=head;
struct Node* copyhead=NULL,*copytail=NULL;
while(cur)
{struct Node* copy=cur->next;struct Node* next=copy->next;//copy节点尾插到新链表if(copytail==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}//恢复原链表cur->next=next;cur=next;
}
return copyhead;}

完整代码

struct Node* copyRandomList(struct Node* head) {struct Node* cur=head;while(cur){//拷贝节点struct Node* next=cur->next;struct Node* copy=(struct Node*)malloc(sizeof(struct Node));copy->val=cur->val;//插入cur->next=copy;copy->next=next;//往后走cur=next;}
//cur=head;
while(cur)
{struct Node* copy=cur->next;//置copy->randomif(cur->random==NULL)copy->random=NULL;elsecopy->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=copy->next;//copy节点尾插到新链表if(copytail==NULL){copyhead=copytail=copy;}else{copytail->next=copy;copytail=copytail->next;}//恢复原链表cur->next=next;cur=next;
}
return copyhead;}

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

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

相关文章

Redis中的渐进式遍历-Scan命令

之前我们学习过遍历命令keys,而keys *是一次性的把整个redis中所有的key都获取到.在不知道当前redis中有多少key的情况下,这个操作是非常危险的,可能会一下子得到太多的key而阻塞redis服务器.从而使其他redis客户端卡顿. 通过渐进式遍历,就可以做到,既可以获取到所有的key,同时…

linux安装kafka教程

kafka需要安装jdk,我的是jdk17 一、安装kafka 1、下载kafka 1.到kafka的官网,去下载想用的kafka包:http://kafka.apache.org/downloads 2.我这里下载的是:kafka_2.12-3.4.1.tgz 3.将安装包传送到服务器并解压(默认…

房产网小程序源码 房产中介小程序源码 房产网源码

房产网小程序源码 房产中介小程序源码 房产网源码 功能介绍: 一、付费发布信息 支持付费发布、刷新、置顶房源信息;二、个人发布信息 支持个人和房产经纪人发布房源信息;三、新房楼盘模块 支持新房楼盘功能,后台添加…

0X03

红包题第二弹 看到源码里面的提示 ?cmdphpinfo(); 看到源码 kk 关键点就是有两个正则表达式 第一个 preg_match("/[A-Za-oq-z0-9$]/",$cmd) 第二个 preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\|\&q…

java--封装

面向对象的三大特征:封装、继承、多态 1.什么是封装 就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些数据的方法,设计到一个对象中去。(每一个类都可以看成封装) 2.封装的设计规范 合理隐藏、合理暴…

Flink SQL Regular Join 、Interval Join、Temporal Join、Lookup Join 详解

Flink ⽀持⾮常多的数据 Join ⽅式,主要包括以下三种: 动态表(流)与动态表(流)的 Join动态表(流)与外部维表(⽐如 Redis)的 Join动态表字段的列转⾏&#xf…

php实现钉钉机器人推送消息和图片内容(完整版)

先来看下实现效果: 代码如下: function send_dingtalk_markdown($webhook , $title , $message "", $atMobiles [], $atUserIds []) {$data ["msgtype" > "markdown","markdown" > ["title" > $title,&quo…

[unity]切换天空盒

序 unity是自带天空盒的: 但有的时候不想用自带的。怎么自定义?如何设置? 官方文档 Unity - Manual: The Lighting window (unity3d.com) 相关窗口的打开方法 天空盒对应的选项 实际操作 从标准材质球到天空盒材质球 新建一个材质球&…

RT-DETR 应用 BiFPN 结构 | 加权双向特征金字塔网络

模型效率在计算机视觉中变得越来越重要。在本文中,我们系统地研究了目标检测中的神经网络架构设计选择,并提出了几种关键的优化方法来提高效率。首先,我们提出了一种加权双向特征金字塔网络(BiFPN),它可以实现简单快速的多尺度特征融合;其次,我们提出了一种复合缩放方法…

Linux Vim批量注释和自定义注释

使用 Vim 编辑 Shell 脚本,在进行调试时,需要进行多行的注释,每次都要先切换到输入模式,在行首输入注释符"#"再退回命令模式,非常麻烦。连续行的注释其实可以用替换命令来完成。 换句话说,在指定…

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图: Sapera Configuration 缓存与内存管理,以及通信端口配置工具,部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…

npm的使用

package.json 快速生成package.json npm init -y “version”: “~1.1.0” 格式为:「主版本号. 次版本号. 修订号」。 修改主版本号是做了大的功能性的改动 修改次版本号是新增了新功能 修改修订号就是修复了一些bug dependencies "dependencies": {&…