复杂链表复制:

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

public class _Q26<T> {public ComplexListNode<T> Clone(ComplexListNode<T> list){if(list == null) return null;CloneNodes(list);ConnectSibling(list);return ReconnectedNodes(list);}private void CloneNodes(ComplexListNode<T> list){ComplexListNode<T> nextNode = list;while(nextNode != null){ComplexListNode<T> node = new ComplexListNode<>();node.value = nextNode.value;node.next = nextNode.next;nextNode.next = node;nextNode = nextNode.next.next; // 复制之后也是需要 一次走两步的}}private void ConnectSibling(ComplexListNode<T> list){ComplexListNode<T> nextNode = list;while(nextNode != null){if(nextNode.sibling != null){nextNode.next.sibling = nextNode.sibling.next;}nextNode = nextNode.next.next; // 一次跨两步}}private ComplexListNode<T> ReconnectedNodes(ComplexListNode<T> list){ComplexListNode<T> result = list.next;ComplexListNode<T> node1 = list;ComplexListNode<T> node2 = result;while(node2 != null){if(node2.next == null){node1.next = null;}else{node1.next = node2.next;node2.next = node2.next.next;}node1 = node1.next;node2 = node2.next;}return result;}}

测试代码:

public class _Q26Test extends TestCase {_Q26 cloneComplexList = new _Q26();public void test(){ComplexListNode<Character> list = new ComplexListNode<>();ComplexListNode<Character> node1 = new ComplexListNode<>();ComplexListNode<Character> node2 = new ComplexListNode<>();ComplexListNode<Character> node3 = new ComplexListNode<>();ComplexListNode<Character> node4 = new ComplexListNode<>();list.value = 'A';node1.value = 'B';node2.value = 'C';node3.value = 'D';node4.value = 'E';list.next = node1;node1.next = node2;node2.next = node3;node3.next = node4;node4.next = null;list.sibling = node2;node1.sibling = node4;node3.sibling = node1;System.out.println("===================================before");ComplexListNode<Character> node = list;while(node != null){System.out.println(node.value + " - " + (node.sibling == null ? "" : node.sibling.value));node = node.next;}ComplexListNode<Character> result = cloneComplexList.Clone(list);System.out.println("===================================after");ComplexListNode<Character> nodeX = result;while(nodeX != null){System.out.println(nodeX.value + " - " + (nodeX.sibling == null ? "" : nodeX.sibling.value));nodeX = nodeX.next;}}}

【剑指offer-Java版】26复杂链表的复制相关推荐

  1. 剑指offer面试题[26]-复杂链表的复制

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

  2. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  3. 剑指offer java版(三)

    二叉搜索树的后序遍历 问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 对于后序遍历来说, ...

  4. 剑指offer java版 test42—找出和为S的两个数,左右夹逼法(双指针法)

    前言:受上一题的启发,这题自己也编出来了.在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围.很实用. 题目: 输入一个递增排序的数组和一个数字S, ...

  5. 剑指offer java版(一)

    二维数组中的查找 问题描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数 ...

  6. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  7. 剑指offer面试题26-复杂链表的复制

    题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead).复制一个复杂链表. 在复杂链表中.每个节点除了一个m_pNext指针指向下一个节点外,另 ...

  8. 【剑指offer】35、复杂链表的复制

    题目 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head. 思路一 我们可以用哈希表来存储<N,N'&g ...

  9. 剑指offer(C++)-JZ35:复杂链表的复制(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指 ...

  10. 剑指offer面试题35. 复杂链表的复制(DFS)(深拷贝)

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

最新文章

  1. RYU控制器的学习笔记(一) ryu.app.rest_router的分析
  2. 【Paper】2021_Synchronization of Resilient Complex Networks Under Attacks
  3. MVC5管道处理模型
  4. strconv---用来基本类型之间的转换
  5. 后端技术:Nginx + Spring Boot 实现负载均衡
  6. 自动以及手动清除手机垃圾文件
  7. 【廖雪峰官方网站/Java教程】多线程(3)
  8. 简单循迹小车实验心得_智能小车实验报告
  9. 当今最热专家凯文•凯利最新演讲精彩全记录
  10. thinkpad重装系统不引导_thinkpad系统重装教程
  11. 51单片机c语言控制led显示屏,51单片机的中断方法以及对LED显示器的控制设计
  12. android studio调用so方法,android studio中的so库调用
  13. opencv制作微信小游戏 最强连一连 辅助(2)--dfs深度优先搜索算法
  14. SE(3)和se(3),左扰动模型
  15. Shell | 文件或关键字查询
  16. ajax页面拼接html,ajax请求拼接html代码
  17. Linux下clock_gettime函数详解
  18. Stetman读paper小记:BackdoorBench - A Comprehensive Benchmark of Backdoor Learning
  19. IllegalArgumentException
  20. python写cdr插件_(如何(用Python)写一个(Lisp)解释器(下))

热门文章

  1. mysql架构设计书籍推荐_最近很火的MySQL:抛开复杂的架构设计,MySQL优化思想基本都在这...
  2. 苹果手机各种型号图片_洪湖苹果X尾插华强北档口诚信收购
  3. 10.QT事件机制源码时序分析(中)
  4. floyd算法_最短路径的算法:Floyd算法
  5. linux shell 日期比较大小,在Shell中使用日期运算和比较详解
  6. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法
  7. WordPress 5.1 发布,监控古老 PHP 版本、编辑器性能提升
  8. 一个关于小程序Iot的具体实现(MQTT版)
  9. 洛谷1850(NOIp2016) 换教室——期望dp
  10. 一个简单的生产消费者示例