面试题26:复杂链表的复制
题目:请实现函数ComplexListNodeClone(ComplexListNodepHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者NULL。结点的C++定义如下:

struct ComplexListNode
{int value;ComplexListNode * next;ComplexListNode * sibling;
};

第一步:

代码如下:

void CloneNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;while (pNode != nullptr){ComplexListNode *pCloned = new ComplexListNode();pCloned->value = pNode->value;pCloned->next = pNode->next;pCloned->sibling = nullptr;pNode->next = pCloned;pNode = pCloned->next;}
}

第二步:

代码如下:

void ConnectSiblingNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;while (pNode != nullptr){ComplexListNode *pCloned = pNode->next;if (pNode->sibling != nullptr){pCloned->sibling = pNode->sibling->next;}pNode = pCloned->next;}
}

第三步:

代码如下:

ComplexListNode *ReconnectNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;ComplexListNode *pClonedHead = nullptr;ComplexListNode *pClonedNode = nullptr;if (pNode != nullptr){pClonedHead = pClonedNode = pNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;}while (pNode != nullptr){pClonedNode->next = pNode->next;pClonedNode = pClonedNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;}return pClonedHead;
}

完整代码如下:

#include <iostream>
using namespace std;struct ComplexListNode
{int value;ComplexListNode * next;ComplexListNode * sibling;
};void CloneNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;while (pNode != nullptr){ComplexListNode *pCloned = new ComplexListNode();pCloned->value = pNode->value;pCloned->next = pNode->next;pCloned->sibling = nullptr;pNode->next = pCloned;pNode = pCloned->next;}
}void ConnectSiblingNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;while (pNode != nullptr){ComplexListNode *pCloned = pNode->next;if (pNode->sibling != nullptr){pCloned->sibling = pNode->sibling->next;}pNode = pCloned->next;}
}ComplexListNode *ReconnectNodes(ComplexListNode *pHead)
{ComplexListNode *pNode = pHead;ComplexListNode *pClonedHead = nullptr;ComplexListNode *pClonedNode = nullptr;if (pNode != nullptr){pClonedHead = pClonedNode = pNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;}while (pNode != nullptr){pClonedNode->next = pNode->next;pClonedNode = pClonedNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;}return pClonedHead;
}ComplexListNode *Clone(ComplexListNode *pHead)
{CloneNodes(pHead);ConnectSiblingNodes(pHead);return ReconnectNodes(pHead);
}

测试用例:
● 功能测试(包括结点中的 m_pSibling 指向结点自身,两个结点的m_pSibling形成环状结构,链表中只有一个结点)。
● 特殊输入测试(指向链表头结点的指针为NULL指针)。
本题考点:
● 考查应聘者对复杂问题的思维能力。本题中的复杂链表是一种不太常见的数据结构,而且复制这种链表的过程也较为复杂。我们把复杂链表的复制过程分解成三个步骤,同时把每一个步骤都用图形化的方式表示出来,这些方法都能帮助我们理清思路。写代码的时候,我们为每一个步骤定义一个子函数,最后在复制函数中先后调用者3个函数。有了这些清晰的思路之后再写代码,就容易多了。
● 考查应聘者分析时间效率和空间效率的能力。当应聘者提出第一种和第二种思路的时候,面试官会提示此时在效率上还不是最优解。这个时候应聘者要能自己分析出这两种算法的时间复杂度和空间复杂度各是多少。

[剑指offer]面试题26:复杂链表的复制相关推荐

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

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

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

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

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

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

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

    剑指offer--面试题26:复杂链表的复制 Solution1: 小套路记住就行!!! 根据书上复杂度为O(n)O(n)O(n)的算法写的,此题加深了对于链表指针的理解与应用! /* struct ...

  5. 剑指offer——面试题56:链表中环的入口

    剑指offer--面试题56:链表中环的入口 Solution1: 非常经典的快慢指针套路题.下面这个链接讲解的很详细.其实问题的关键在于为什么快指针的速度一定是慢指针的2倍,3倍或4倍行不行?? 快 ...

  6. [剑指offer]面试题15:链表中倒数第k个结点

    面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...

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

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

  8. 剑指offer面试题26. 树的子结构(链表)

    题目描述 输入两棵二叉树A和B,判断B是不是A的子结构.(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值. 思路 详见链接 代码 class Solution ...

  9. 剑指offer面试题15:链表中倒数第K个节点

    题目:输入一个链表,输出该链表的倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点. 解题思路: 解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可 ...

最新文章

  1. java 读取excel_Java12POI操作Excel
  2. 贝叶斯网络之父Judea Pearl:新因果科学与数据科学、人工智能的思考
  3. NEU 1040 Count
  4. 理科的至尊思想:进制之间的转换
  5. 用好这几款炼丹利器,调参从此得心应手 | Let's Fork
  6. ITK:从标量图像创建矢量图像
  7. 在网页中给Flash加上超级链接
  8. 初识Sentinel
  9. Mybatis报错: Invalid bound statement (not found)...
  10. 2021-2025年中国超声波管道监测系统行业市场供需与战略研究报告
  11. 判定是否支持XHTML
  12. Node.js的安装下载和运行JS代码和常用命令和按键
  13. 荷兰国旗问题(C语言)
  14. 关于LED限流电阻计算的那些事儿
  15. JanusGraph基础知识
  16. Intellij IDEA如何打包jar文件?
  17. 转行成为数据分析师的经验分享
  18. j和jk是有区别的_科普向,大家都说jk,jk是什么意思呢?
  19. iconfont在IE下不兼容问题
  20. Spark教程——(10)Spark SQL读取Phoenix数据本地执行计算

热门文章

  1. 【ArcGIS风暴】根据海拔(坡度)范围分级统计土地覆盖的类型和面积(兰州市GlobeLand30m数据为例)
  2. GIS宣传片《地理空间信息革命》视频全集
  3. Android之BaseQuickAdapter.setOnItemChildClickListener点击死人也没反应的原因
  4. Android之最简单和靠谱的监听Home键和菜单键(最近任务栏)
  5. C++之char*,const char*和string的相互转换
  6. 栈和队列之用java实现栈
  7. 一套完整的导视设计案例_色彩导视艺术:乌克兰基辅语言学校导视设计案例
  8. loadrunner发送json_Loadrunner模拟JSON接口请求进行测试
  9. 知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...
  10. 当代年轻人,都有些不成文的规定?