##什么是复杂链表?

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

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语言)相关推荐

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

    复杂链表的复制问题 引言 问题描述 思路分析 思路一: 思路二: 图解: 代码实现 总结 引言 小编学习了这么久单链表感觉自我良好,想着刷道题测试一下,看到了一个中等难度的题目,小编想着尝试一下,结果 ...

  2. C语言复杂链表的复制

    LC:复制带随机指针的链表 复杂链表表述: 长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 要求: 构造这个链表的 深拷贝. 深拷贝应 ...

  3. 剑指Offer面试题:24.复杂链表的复制

    一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...

  4. 剑指offer:面试题35. 复杂链表的复制

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

  5. 剑指offer 26:复杂链表的复制

    复杂链表的复制 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数 ...

  6. 【剑指offer-Java版】26复杂链表的复制

    复杂链表复制: 一种思路是通过哈希表存放sibling的配对信息 – 没看明白 一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式 分三步,还是比较好懂的 public c ...

  7. python 带随机指针的链表深度复制_LeetCode:复制带随机指针的链表

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

  8. hashmap 复制_复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判断 ...

  9. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

最新文章

  1. Numpy中数组间运算
  2. currentdate mysql_Mysql】Mysql中CURRENT_TIMESTAMP,CURRENT_DATE,CURRENT_TIME,now(),sysdate()各项值的区别...
  3. php 赋值 递增,PHP 基础(赋值及函数)
  4. mysql otter 数据同步_MySQL数据同步之otter
  5. 开启 JM 的 trace 功能
  6. 【操作系统】进程与程序的比较
  7. MATLAB信号处理之信号的采样
  8. MaxScale Binlog Server实践
  9. CDH修改PySpark默认的Python版本
  10. binder.java 565_Android跨进程抛异常的原理的实现
  11. 屏幕画笔工具pointofox安装过程
  12. JAVA学生成绩管理系统(增删改查)
  13. (转)RemapKey等:小巧实用的键盘映射工具
  14. Java 开发实例(第3篇),绘制迷宫1 生成迷宫地图
  15. Win10 中主机名hosts 文件位置
  16. R 单样本wilcoxon test
  17. java寻宝题目,寻宝
  18. Linux tail命令的使用方法详解
  19. BlockingQueue(阻塞队列)详解
  20. MongoDB数据库设计中6条重要的经验法则(一)

热门文章

  1. 网络提速降费助力“互联网+”发展
  2. [附源码]JSP+ssm计算机毕业设计仓库管理系统设计z3g13【源码、数据库、LW、部署】
  3. 增删改查测试场景(菜市场的大妈都能看懂)
  4. 话说贝塔斯曼和99read
  5. 【论文翻译】R-CNN
  6. ArchLinux中安装Virtualbox Guest Additions增强功能
  7. Java如何对一个对象进行深拷贝?
  8. arduino 伸缩轨道_基于Arduino的多轨道Midi音序器的实现
  9. react 字段拼接
  10. 计算机华宇平台负责人 - 阿撒