题目

  请实现函数 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 复杂链表的复制相关推荐

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

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

  2. 《剑指offer》第三十五题(复杂链表的复制)

    // 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...

  3. 程序员面试题精选100题(49)-复杂链表的复制[算法]

    题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL.其结点的C++定义如下: struct ComplexNode ...

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

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

  5. leetcode算法题--回文链表

    原题链接:https://leetcode-cn.com/problems/palindrome-linked-list/ 1.链表转数组 bool isPalindrome(ListNode* he ...

  6. 经典算法题 -- 判断单链表是否成环及寻找成环节点

    引言 判断单链表是否成环是一个计算机领域的经典算法问题 如何通过程序判断传入的链表是否存在环,并且求出环长度.成环点等问题 下面就是一个存在环的单链表 基本算法 -- hash 最简单的方法是创建一个 ...

  7. [剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

    [问题描述][中等] [解答思路] 1. 暴力 直接复制 将链表从头节点一个一个复制下去, 在根据记录的总长度num,遍历原来的每个节点的random到尾节点个数count,然后顺序遍历找到新链表的该 ...

  8. 算法题:删除链表中指定值的节点(Java实现)

    去美菜网面试,第一道算法笔试题就是这个,题目很清楚,删除链表中指定值的节点,假定有这样的链表:1->2->6->3->4->5->6,现在要求删除值为6的节点,输入 ...

  9. leetcode算法题--删除排序链表中的重复元素 II

    原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 1.map ListNode* deleteD ...

最新文章

  1. 改变linux分区后grub修复,更改磁盘分区后修复GRUB启动
  2. github/gitlab同时管理多个ssh key
  3. C语言开发笔记(一)自动转换和强制转换
  4. python数据结构 树_Python数据结构——AVL树的实现
  5. 3ds max学习笔记(二)--查看视点
  6. webapi net 直接更改协议头
  7. linux 快速建网站,如何快速建站,新手快速搭建网站教程
  8. 影像组学工作站:医学影像组学中多模态的任务类型
  9. sql语句 四表联查
  10. Android碎碎念4:避免Dialog抢Activity焦点
  11. 甘草干姜汤治疗肺虚寒
  12. 『孩子快抓紧妈妈的手』
  13. 铁匠smith_铁匠的制作:概念和艺术创作
  14. (Unity游戏开发)五天时间做出一款饥荒类的生存游戏Demo,项目在手,还怕面试官不给offer?
  15. AI行业精选日报_人工智能(12·16)
  16. 仿真软件测试基尔霍夫定律,基尔霍夫定律教案.doc
  17. 最令我。。。。的一首诗
  18. SpringBoot 出现 Consider defining a bean of type ‘xxx‘ in your configuration 问题解决方案
  19. JVM编译过程与后期的优化
  20. 解决USB3.0接口传输速度慢的问题

热门文章

  1. 【转载】程序员有哪些电脑技能让外行感到神奇?
  2. 7、redis之使用spring集成commons-pool来操作常见数据类型
  3. hibernate里的generator中class =value介绍
  4. Mac+docker+flask
  5. 在Ubuntu下利用Eclipse调试FFmpeg
  6. centos6.5编译安装php7
  7. Jenkins TFS配置
  8. 了解AdvStringGrid
  9. [备忘]silverlight中关于“复制到输出目录”和“生成操作”
  10. IBatis存取图片在Oracle Blob大字段中Asp.Net