复杂链表的复制(C语言)
##什么是复杂链表?
展示一下复杂链表的结构体样式。
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语言)相关推荐
- 单链表之复杂链表的复制(C语言版)
复杂链表的复制问题 引言 问题描述 思路分析 思路一: 思路二: 图解: 代码实现 总结 引言 小编学习了这么久单链表感觉自我良好,想着刷道题测试一下,看到了一个中等难度的题目,小编想着尝试一下,结果 ...
- C语言复杂链表的复制
LC:复制带随机指针的链表 复杂链表表述: 长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 要求: 构造这个链表的 深拷贝. 深拷贝应 ...
- 剑指Offer面试题:24.复杂链表的复制
一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...
- 剑指offer:面试题35. 复杂链表的复制
题目:复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 ...
- 剑指offer 26:复杂链表的复制
复杂链表的复制 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数 ...
- 【剑指offer-Java版】26复杂链表的复制
复杂链表复制: 一种思路是通过哈希表存放sibling的配对信息 – 没看明白 一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式 分三步,还是比较好懂的 public c ...
- python 带随机指针的链表深度复制_LeetCode:复制带随机指针的链表
请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. 思路: ...
- hashmap 复制_复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判断 ...
- 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和
一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...
最新文章
- Numpy中数组间运算
- currentdate mysql_Mysql】Mysql中CURRENT_TIMESTAMP,CURRENT_DATE,CURRENT_TIME,now(),sysdate()各项值的区别...
- php 赋值 递增,PHP 基础(赋值及函数)
- mysql otter 数据同步_MySQL数据同步之otter
- 开启 JM 的 trace 功能
- 【操作系统】进程与程序的比较
- MATLAB信号处理之信号的采样
- MaxScale Binlog Server实践
- CDH修改PySpark默认的Python版本
- binder.java 565_Android跨进程抛异常的原理的实现
- 屏幕画笔工具pointofox安装过程
- JAVA学生成绩管理系统(增删改查)
- (转)RemapKey等:小巧实用的键盘映射工具
- Java 开发实例(第3篇),绘制迷宫1 生成迷宫地图
- Win10 中主机名hosts 文件位置
- R 单样本wilcoxon test
- java寻宝题目,寻宝
- Linux tail命令的使用方法详解
- BlockingQueue(阻塞队列)详解
- MongoDB数据库设计中6条重要的经验法则(一)