算法题26 复杂链表的复制
题目
请实现函数 ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个 next 域指向下一个结点外,还有一个 sibling 指向链表中的任意结点或者 null。
分析
解题参见http://wiki.jikexueyuan.com/project/for-offer/question-twenty-six.html
引用
图 4.8 是一个含有 5 个结点的复杂链表。图中实线箭头表示 next 指针,虚线箭头表示 sibling 指针。为简单起见,指向 null 的指针没有画出。
在不用辅助空间的情况下实现 O(n)的时间效率。
第一步:仍然是根据原始链表的每个结点N 创建对应的 N’。把 N’链接在N的后面。图 4.8 的链表经过这一步之后的结构,如图 4.9 所示。
第二步:设置复制出来的结点的 sibling。假设原始链表上的 N 的 sibling 指向结点 S,那么其对应复制出来的 N’是 N的 pext 指向的结点,同样 S’也是 S 的 next 指向的结点。设置 sibling 之后的链表如图 4.10 所示。
第三步:把这个长链表拆分成两个链表。把奇数位置的结点用 next 链接起来就是原始链表,把偶数位置的结点用 next 链接起来就是复制 出来的链表。图 4.10 中的链表拆分之后的两个链表如图 4.11 所示。
代码
1 struct CListNode 2 { 3 char value; 4 CListNode* pNext; 5 CListNode* pSibLing; 6 }; 7 8 CListNode* CopyComplexList(CListNode* head) 9 { 10 if (!head) 11 { 12 throw std::exception("Invalid Input."); 13 } 14 15 CListNode* node=head; 16 while(node!=NULL) 17 { 18 CListNode* cnode=new CListNode(); 19 cnode->value=node->value; 20 cnode->pNext=node->pNext; 21 node->pNext=cnode; 22 node=cnode->pNext; 23 } 24 25 node=head; 26 CListNode* cnode; 27 while (node!=NULL) 28 { 29 cnode=node->pNext; 30 31 if (node->pSibLing) 32 { 33 cnode->pSibLing=node->pSibLing->pNext; 34 }else 35 { 36 cnode->pSibLing=NULL; 37 } 38 39 node=cnode->pNext; 40 } 41 42 //split the list 43 node=head; 44 CListNode* chead=head->pNext; 45 while (node!=NULL) 46 { 47 cnode=node->pNext; 48 49 node->pNext=cnode->pNext; 50 if (node->pNext) 51 { 52 cnode->pNext=node->pNext->pNext; 53 }else 54 { 55 cnode->pNext=NULL; 56 } 57 58 node=node->pNext; 59 } 60 61 return chead; 62 }
转载于:https://www.cnblogs.com/wangzaizhen/p/5272615.html
算法题26 复杂链表的复制相关推荐
- 【剑指offer-Java版】26复杂链表的复制
复杂链表复制: 一种思路是通过哈希表存放sibling的配对信息 – 没看明白 一种思路是直接在原始链表中复制,然后拆分 – 属于时间和空间效率都比较高的方式 分三步,还是比较好懂的 public c ...
- 《剑指offer》第三十五题(复杂链表的复制)
// 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...
- 程序员面试题精选100题(49)-复杂链表的复制[算法]
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL.其结点的C++定义如下: struct ComplexNode ...
- 剑指offer面试题[26]-复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- leetcode算法题--回文链表
原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/ 1.链表转数组 bool isPalindrome(ListNode* he ...
- 经典算法题 -- 判断单链表是否成环及寻找成环节点
引言 判断单链表是否成环是一个计算机领域的经典算法问题 如何通过程序判断传入的链表是否存在环,并且求出环长度.成环点等问题 下面就是一个存在环的单链表 基本算法 -- hash 最简单的方法是创建一个 ...
- [剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]
[问题描述][中等] [解答思路] 1. 暴力 直接复制 将链表从头节点一个一个复制下去, 在根据记录的总长度num,遍历原来的每个节点的random到尾节点个数count,然后顺序遍历找到新链表的该 ...
- 算法题:删除链表中指定值的节点(Java实现)
去美菜网面试,第一道算法笔试题就是这个,题目很清楚,删除链表中指定值的节点,假定有这样的链表:1->2->6->3->4->5->6,现在要求删除值为6的节点,输入 ...
- leetcode算法题--删除排序链表中的重复元素 II
原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 1.map ListNode* deleteD ...
最新文章
- 改变linux分区后grub修复,更改磁盘分区后修复GRUB启动
- github/gitlab同时管理多个ssh key
- C语言开发笔记(一)自动转换和强制转换
- python数据结构 树_Python数据结构——AVL树的实现
- 3ds max学习笔记(二)--查看视点
- webapi net 直接更改协议头
- linux 快速建网站,如何快速建站,新手快速搭建网站教程
- 影像组学工作站:医学影像组学中多模态的任务类型
- sql语句 四表联查
- Android碎碎念4:避免Dialog抢Activity焦点
- 甘草干姜汤治疗肺虚寒
- 『孩子快抓紧妈妈的手』
- 铁匠smith_铁匠的制作:概念和艺术创作
- (Unity游戏开发)五天时间做出一款饥荒类的生存游戏Demo,项目在手,还怕面试官不给offer?
- AI行业精选日报_人工智能(12·16)
- 仿真软件测试基尔霍夫定律,基尔霍夫定律教案.doc
- 最令我。。。。的一首诗
- SpringBoot 出现 Consider defining a bean of type ‘xxx‘ in your configuration 问题解决方案
- JVM编译过程与后期的优化
- 解决USB3.0接口传输速度慢的问题
热门文章
- 【转载】程序员有哪些电脑技能让外行感到神奇?
- 7、redis之使用spring集成commons-pool来操作常见数据类型
- hibernate里的generator中class =value介绍
- Mac+docker+flask
- 在Ubuntu下利用Eclipse调试FFmpeg
- centos6.5编译安装php7
- Jenkins TFS配置
- 了解AdvStringGrid
- [备忘]silverlight中关于“复制到输出目录”和“生成操作”
- IBatis存取图片在Oracle Blob大字段中Asp.Net