复杂链表的复制(C语言)

【剑指offer】复杂链表的复制(详解 + 两种方法) 【剑指offer】复杂链表的复制 【本题链接】 【题目描述】 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 【题目分析】 本题具有一定难度,主要考查了对于链表的掌握,我们主要使用两种方法解决此题,常规方法逻辑思维比较复杂,对于数据结构的掌控力要求比较高,可以有效的锻炼代码能力和逻辑思维。第二种使用map解决,较为方便 阅读详情

##什么是复杂链表?

展示一下复杂链表的结构体样式。

typedef struct ComplexNode
{
	struct ComplexNode *next;
	struct ComplexNode *random; //指向一个随机值
	int data;
}ComplexNode;

复杂链表就是一个带着random指针的单链表。由于random指向的不确定性。让复杂链表的操作存在一定的困难。

假定现在有一个复杂链表的形状如下图:

在这里插入图片描述

首先我得思路是创建一个新的链表,依次复制每个节点,但是问题出现了,random指向一个随机值,这个随机值可能没有创建呢,所以依次复制会出现错误。 random的复制成了难题。

所以常规方法行不通,有时候一条路走到黑就真的黑了。

##解题思路

1.首先我们在每个链表节点的后面创建一个新的节点,将其串联起来。如下图的黄色箭头所示。
如图所示:

在这里插入图片描述

2.接下来,我们将它的新节点的random指向该指的地方,如下图的绿色箭头所示。
如图所示:
在这里插入图片描述

3.接下来我们把两个混在一起的链表拆开,拆开就可以变成两个链表。
如图所示:

在这里插入图片描述

##用C语言实现上述操作过程

ComplexNode* Copy(ComplexNode **List)
{
	//在每个链表节点后面加一个节点。
	
	ComplexNode *cur = *List;
	ComplexNode *NewNode = NULL;
	ComplexNode *Next = NULL;
	ComplexNode *NewNodeNext = NULL;
	ComplexNode *NewList = NULL;

	while (cur != NULL)  //通过循环在原始链表的基础上创建新的链表,并且挂载在后面。
	{
		NewNode = CreateNode(cur->data); //createnode函数是创建一个新的节点
		NewNode->next = cur->next;
		cur->next = NewNode;
		cur = NewNode->next;
	}
	

	//改变链表的随机指针域的结构
	
	cur = *List;

	while (cur != NULL)
	{
		if (cur->random != NULL)  //这个只要random的值不是null就需要找到 对应的newnode的random的位置。
		{
			NewNode = cur->next;
			NewNode->random = cur->random->next;
		}
		cur = cur->next->next; //依次条两个节点相当于在原链表上移动一个
	}
	
	//将新旧两个链表拆开
	
	cur = *List;
	NewList = cur->next;   
	//cur修正的是原链表,NewList修正的是新链表
	while (cur != NULL)
	{
		NewNode = cur->next;
		Next = cur->next->next;
		if (Next == NULL)  //当Next为空时,说明链表的修正快要结束了。
		{
			NewNodeNext = NULL;
		}
		else
		{

			NewNodeNext = Next->next;
		}
		cur->next = Next;
		NewNode->next = NewNodeNext;
		cur = Next;
	}
	return NewList;
}
C语言之复杂链表的复制方法(图示详解) 什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表。 复杂链表的数据结构如下: typedef int DataType; //数据域的类型 //复杂链表的数据结构 typedef struct ComplexNode { DataType _data ; // 数据 struct ComplexNode * _next; // 指向下个节点的指针 struct Complex 立即下载

相关推荐

MODBUS通讯不求人:手把手教你用三菱FX2N控制士林变频器

本文详细介绍了如何使用三菱FX2N PLC通过MODBUS协议控制士林变频器,涵盖硬件连接、参数配置、程序设计及通讯优化等关键步骤。特别针对没有内置MODBUS函数块的老款PLC,提供了CRC校验和稳定数据交换的实用解决方案,帮助工程师快速实现工业自动化设备的高效通讯。

v4w5x6的博客 226

C语言——随机链表的深拷贝问题

最近做了一道非常有趣的链表题,题目是随机链表的复制,题中的链表与普通链表相比多了一个指向NULL或随机节点的随机指针,而这道题的解法非常妙。

wu_geng_liu_li的博客 515

保姆级教程:QGC地面站Vehicle Setup全模块配置详解(从固件升级到安全设置)

本文提供QGC地面站Vehicle Setup全模块配置的保姆级教程,涵盖从固件升级到安全设置的完整流程。详细解析二次开发环境准备、传感器校准、飞行模式配置等关键步骤,帮助用户快速掌握无人机配置技巧,确保飞行安全与性能优化。

weixin_28726671的博客 387

复制复杂链表的实现

本文给大家详细讲解了带随机指针域链表的两种解题方法,一定能让对此题有困惑的同学带来较大的帮助。

qq_68601751的博客 1071

“开宝五子棋陪练”-首款开放智能的五子棋习题练习安卓应用

使用Kotlin语言以及Jetpack Compose UI库开发,主要就是写Composable函数,显示棋盘、棋子和一些按钮,响应用户的点击和滑动操作,以及保存和恢复数据。但我针对本应用是用于做题的特殊需求,对该算法库做了一个简单的JNI层封装,方便UI前端Kotlin代码的调用。

weixin_44120030的博客 2397

3D slicer查看形变场

3Dslice显示数据和形变场 将需要可视化的数据也导入3Dslice,注意描述为volume(图1a),如果没有显示是因为路径中不能有中文,也就是moving图像。 (b) 图1、数据导入形变场和 将相应的形变场数据直接拖入3Dslice,并修改描述为形变场(图1b)。 点击transform菜单图2(a),然后勾选形变场可视化图2(b)。 (b) 图2...

fanre的专栏 1947

链表:常见面试题-拷贝特殊链表

链表:常见面试题-拷贝特殊链表,这种链表每个节点多出一个特殊节点:Random

个人专长:数据结构和算法、大数据、数据库、主流框架 706

TX 的 LOL(Local Oscillator Leakage,本振泄露)

项目内容LOL 是什么本振残留在 TX 输出中心频率上的杂散主要原因IQ 失衡、硬件不完美、零中频架构影响杂散、干扰、性能劣化、安全问题解决方法初始化校准 + 跟踪校准(AD9371 支持)检测手段频谱仪、回环检测、ADC ILA 抓取。

weixin_41230430的博客 2048

【数据结构】研究链表深度拷贝问题

本篇总结链表如何深度拷贝,考虑链表拷贝后地址不能相同,采用一种独特的方式来拷贝原链表的相对位置,图文分析,更好理解。

Extreme_wei的博客 679

H医药公司配送中心布局仿真优化

新增2个Source,Source1命名为“货物到达”,用来进行仿真供应商原料到达,Source2命名为“订单到达”,用来进行仿真客户需求订单的到达,如下图是设置两个发生器的具体参数。通过主操作界面上的各个实体工具,如发生器、暂存区、货架、处理器、吸收器等实体工具对初始模型和优化后的方案模型进行仿真建模,建立优化前后的模型图如下图所示。通过下表可以看出,优化前操作员的总运行距离为132.11km,而优化后操作员的总运行距离为128.17km,运行距离缩短,操作员的疲劳强度降低。

m0_72514516的博客 2529

OpenClaw终于有了图形界面,一键安装使用你的24小时AI 研究助手!

ClawX是连接强大 AI 智能体与普通用户之间的桥梁。基于OpenClaw构建,它将命令行式的 AI 编排转变为易用、美观的桌面体验——无需使用终端。无论是自动化工作流、连接通讯软件,还是调度智能定时任务,ClawX 都能提供高效易用的图形界面,帮助你充分发挥 AI 智能体的能力。ClawX 预置了最佳实践的模型供应商配置,原生支持 Windows 平台以及多语言设置。当然,你也可以通过设置 → 高级 → 开发者模式来进行精细的高级配置。

Maynor的博客 3392

c语言—复杂链表的复制

所谓复杂链表,指的是链表中每个节点不仅有指向下一个节点的next指针,还有一个radom指针指向一个随机节点,甚至可以指向自己,可以指向空。 typedef struct ListNode { DataType data; struct ListNode* next; //next指向下一个节点 struct ListNode* radom; //radom指向随机节点 }L

来信 1770

手把手教你学simulink(40.1)--水力发电场景示例:基于 Simulink 的抽水蓄能电站水力发电

项目背景抽水蓄能电站是一种重要的储能技术,广泛应用于电力系统的调峰填谷、频率调节和备用电源。它通过在电力负荷低谷时将水从下水库抽到上水库储存,在电力负荷高峰时释放水进行发电,从而实现电能的高效利用。与传统的水电站不同,抽水蓄能电站可以在短时间内快速响应电网的需求,具有良好的灵活性和可靠性。本项目旨在使用 MATLAB/Simulink 模拟一个完整的抽水蓄能电站的水力发电过程,包括水泵-涡轮机系统、发电机、水道系统、控制系统等,并实现对电站的精确控制,确保其在不同工况下都能稳定运行。

MHD0815的博客 886

c语言链表的复制,c 语言 复杂链表的复制

//头文件#pragmaoncetypedefintDataType;typedefstructComplexNode{DataType_data;//数据structComplexNode*_next;//指向下一个节点的指针structComplexNode*_random;//指向随机节点}ComplexNode,*pComplexNode;voidBuyNode...

weixin_42512723的博客 913

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复杂链表的复制(C 语言 和 Java 语言)

所谓的复杂链表指的是一个链表有若干各节点,每一个节点右移个数据域专门用来存放数据,还有两个指针域其中一个纸箱下一个结点,还有一个随机指向当前复杂链表中的任意一个结点或者是一个空节点。 如下图所示,就是一个复杂链表: 解题思路: 1.定义链表结构: 2.把要拷贝的结点插入该链表 在完成该操作之后,新链表的random就在原来链表的random之后了 3...

Atalanta1的博客 341

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C语言复杂链表的复制

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

YT的博客 343

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

c语言怎样复制链表,C语言之复杂链表的复制(图示详解)

什么是复杂链表?复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表。复杂链表的数据结构如下:1 typedef int DataType; //数据域的类型23 //复杂链表的数据结构45 typede...

weixin_42491590的博客 1594

c语言中链表的作用和结构图,C语言之复杂链表的复制方法(图示详解)

什么是复杂链表?复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表。复杂链表的数据结构如下:typedef int DataType; //数据域的类型//复杂链表的数据结构typedef struct Compl...

weixin_36217920的博客 334

c 语言 复杂链表的复制

//头文件 #pragmaonce typedefintDataType; typedefstructComplexNode { DataType _data; //数据 structComplexNode*_next; //指向下一个节点的指针 structComplexNode*_random; //指向随机节点 }Complex...

weixin_34378045的博客 76

复杂链表的复制(C语言)

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

qq_67411584的博客 587

复制复杂链表 C语言

请实现一个函数可以复制一个复杂链表。在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针(随机指针)指向链表中的任意结点或者null。

qq_51709541的博客 123

单链表之复杂链表的复制(C语言版)

复杂链表的复制,综合性较强,学习其中的思路是最重要的。三步走思路,时间复杂度O(n)。

m0_54469145的博客 1278

C语言-数据结构-复杂链表复制

因为将复制的节点插入每个节点的后面时,就可以根据被复制的节点的random所指的节点的下一个节点就是复制的节点所应该指向的random节点。每次复制一个节点,就将其插入到被复制的结点的后面,复制完成后,再根据原结点复制random指针,最后拆分链表,还原原链表。函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个。给定的链表为空(空指针),因此返回 null。指针指向下一个节点,还有一个。指针指向链表中的任意节点或者。此题的难点在于对随机对应的赋值。此题运用了一个巧妙的思路。

ObsidianGro的博客 281

C语言之复杂链表的复制(图示详解)

什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表。 复杂链表的数据结构如下: 1 typedef int DataType; //数据域的类型 2 3 //复杂...

weixin_30907523的博客 289

C语言编程实战:每日一题:随机链表的复制

本文介绍了一种高效复制随机链表的方法,采用"原地复制+拆分"策略实现O(n)时间复杂度和O(1)空间复杂度。该方法分三步:1)在原节点后插入拷贝节点;2)利用节点成对结构设置random指针;3)拆分出独立拷贝链表。关键点在于通过原节点的random直接定位其拷贝节点,无需额外空间存储映射关系。文末提供了完整C代码实现和详细流程图解,适用于含随机指针的复杂链表深拷贝场景。

分享 AI 时代程序员的进阶之路:大模型应用、AI 编程工具实战,同时沉淀 C / Linux 底层技术笔记。与君共赴,万里征途。 1154
上一篇: Linux下进程知识(1)
下一篇: Linux下进程的总结(2)
H_Strong
博客等级 码龄9年 37粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值