复制带随机指针的链表
创始人
2025-05-30 07:21:26
0

目录

一、题目描述

二、代码实现

三、图解示例一



一、题目描述

给你一个长度为 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
  • -10^4 <= Node.val <= 10^4
  • Node.random 为 null 或指向链表中的节点。


二、代码实现

struct Node* copyRandomList(struct Node* head) 
{if (head == NULL){return NULL;}// 1. 将拷贝节点链接到其对应的原节点后面struct Node* cur = head;while (cur != NULL){// 拷贝节点struct Node* copy = (struct Node*)malloc(sizeof(struct Node));copy->val = cur->val;// 链接copy->next = cur->next;  // (1)cur->next = copy;  // (2)// 更新 curcur = copy->next;}// 2. 让拷贝节点的 random 指针指向复制链表中的拷贝节点或空节点cur = head;while (cur != NULL){struct Node* copy = cur->next;if (cur->random == NULL){copy->random = NULL;}else{// 此时拷贝节点的 random 就是其对应的原节点的 random->nextcopy->random = cur->random->next;  }cur = copy->next;}// 3. 还原原链表以及复制链表cur = head;struct Node* copy = cur->next;struct Node* copyHead = copy;while (copy->next != NULL)  // 注意循环条件{cur->next = copy->next;cur = cur->next;copy->next = cur->next;copy = copy->next;}cur->next = NULL;  // 将原链表的尾节点的 next 指针置为 NULLreturn copyHead;
}


三、图解示例一

  1. 将拷贝节点链接到其对应的原节点后面

  2. 让拷贝节点的 random 指针指向复制链表中的拷贝节点或者空节点

  3. 还原原链表及复制链表

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...