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

面试题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个函数。有了这些清晰的思路之后再写代码,就容易多了。
● 考查应聘者分析时间效率和空间效率的能力。当应聘者提出第一种和第二种思路的时候,面试官会提示此时在效率上还不是最优解。这个时候应聘者要能自己分析出这两种算法的时间复杂度和空间复杂度各是多少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud + Docker

Dockerfile构建Docker 镜像 注意这里说的Dockerfile是指的一个文本文件&#xff0c;类似txt&#xff0c;只不过名字是Dockerfile&#xff0c;里面编辑Docker的一些指令&#xff0c;指令作用在于描述构建镜像的细节。如下一个简单的案例&#xff0c;用上一节中下载的nginx镜像来…

从编码层面对比java和c#

java和c#都是面向对象编程高级语言&#xff0c;总体上来讲&#xff0c;它们还是很相似的&#xff0c;因为它们在发展过程中都很大程序上学习了对方不少优秀的特性。所以&#xff0c;一般来说&#xff0c;从其中一门语言转换到另外一门语言应该都不会有很大问题。虽然说这两门语…

[剑指offer]面试题28:字符串的排列

面试题28&#xff1a;字符串的排列 题目&#xff1a;输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。例如输入字符串abc&#xff0c;则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路: 这是一个典型的递归问题&#xff0c;考虑…

红帽借“订阅”模式成开源一哥,首创者升任总裁

4 月 6 日&#xff0c;红帽公司宣布&#xff0c;产品和技术总裁 Paul Cormier 即日起任红帽总裁&#xff0c;并兼任首席执行官。Paul Cormier 是开源商业化“订阅”模式的提出者&#xff0c;这一模式促使红帽达成连续超70个季度的盈利&#xff0c;身价升至340亿美金&#xff0c…

Docker中数据管理

Docker数据管理 生产环境中&#xff0c;对数据进行持久化&#xff0c;或者需要在多个容器直接进行数据共享&#xff0c;这必然涉及到容器的一些数据管理的操作。容器中数据管理主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;&#xff1a;容器内数据直…

[剑指offer]面试题31:连续子数组的最大和

面试题31&#xff1a;连续子数组的最大和 题目&#xff1a;输入一个整型数组&#xff0c;数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O&#xff08;n&#xff09;。 ❖ 解法一&#xff1a;举例分析数组的规…

C#两大知名Redis客户端连接哨兵集群的姿势

前言前面《Docker-Compose搭建Redis高可用哨兵集群》&#xff0c;我的思路是将Redis、Sentinel、Redis Client App链接到同一个网桥网络&#xff0c;这个网桥内的Redis Client App就可以使用ContainerIP访问网桥内任意redis节点。同一网桥网络访问规避了Docker上发生的NAT&…

Docker之Dockerfile详解

使用Dockerfile创建镜像 Dockerfile是一个文本格式的配置文件&#xff0c;我们可以利用Dockerfile来快速的创建一个自定义的镜像。 基本结构 Dockerfile由一行命令语句组成&#xff0c;并且支持以#开头的注释一般包括四个部分&#xff1a;基础镜像信息&#xff0c;维护者信息…

[剑指offer]面试题34:丑数

面试题34&#xff1a;丑数 题目&#xff1a;我们把只包含因子2、3和5的数称作丑数&#xff08;Ugly Number&#xff09;。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数&#xff0c;但14不是&#xff0c;因为它包含因子7。习惯上我们把1当做第一个丑数。 ❖ 逐个判断每…

创业的N种死法

点击蓝字关注&#xff0c;回复“职场进阶”获取职场进阶精品资料一份互联网的江湖一直流传着大佬们的创业传奇。马云上厕所几分钟敲定几千万美金融资。王石走投无路靠倒卖玉米赚到上百万从此逆袭。扎克伯格为了获得哈佛美女照片&#xff0c;开发一个小玩意从此改变了世界。传奇…

Docker容器实战思维

Docker成功的基础 Docker的实现用到的基础技术&#xff08;cgroups, namespace&#xff0c;分层文件系统&#xff09;在Docker之前已经存在很多年&#xff0c;并且 Linux Containers&#xff08;LXC&#xff09;也在很多企业的环境中得到了大量的应用实践&#xff0c;并得到明…

[剑指offer]面试题35:第一个只出现一次的字符

面试题35&#xff1a;第一个只出现一次的字符 题目&#xff1a;在字符串中找出第一个只出现一次的字符。如输入"abaccdeff"&#xff0c;则输出’b’。 代码如下: char FirstNotRepeatingChar(char *pString) {if (pString nullptr) return \0;const int tableSize…

dotNET Core 3.X 请求处理管道和中间件的理解

理解 dotNET Core 中的管道模型&#xff0c;对我们学习 dotNET Core 有很大的好处&#xff0c;能让我们知其然&#xff0c;也知其所以然&#xff0c;这样在使用第三方组件或者自己写一些扩展时&#xff0c;可以避免入坑&#xff0c;或者说避免同样的问题多次入坑。本文分为以下…

数据结构与算法--实现Singleton模式

题目&#xff1a;设计一个类&#xff0c;我们只生成该类的一个实例。 只生成一个实例的类就是实现Singleton&#xff08;单例&#xff09;模式的类型。本题其实主要考察我们设计模式&#xff0c;因为面试的时候先来一个简单的&#xff0c;并且喜欢面设计模式相关的题目&#x…

[剑指offer]面试题37:两个链表的第一个公共结点

面试题37&#xff1a;两个链表的第一个公共结点 题目&#xff1a;输入两个链表&#xff0c;找出它们的第一个公共结点。链表结点定义如下&#xff1a; struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {} };思路: 两个链表长度分别为L1C、L2C&…

了解.NET中的垃圾回收

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。尽管这是一篇来自2009年的古老的文章&#xff0c;但或许能够对你理解GC产生一些作用。 了解.NET中的垃圾回收一旦了解了.NET的垃圾收集器是如何工作的&#xff0c;那么可能会触及.NET应用程序的一些更为神秘的问题时&…

数据结构与算法--数组:二维数组中查找

数组 数组最简单的是数据结构&#xff0c;占据一整块连续的内存并按照顺序存储数据&#xff0c;创建数组时候&#xff0c;我们需要首先指定数组的容量大小&#xff0c;然后根据大小分配内存。即使我们只在数组中存储一个元素&#xff0c;亚需要为所有数据预先分配内存&#xf…

[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列

面试题41&#xff1a;和为s的两个数字VS和为s的连续正数序列 题目一&#xff1a;输入一个递增排序的数组和一个数字s&#xff0c;在数组中查找两个数&#xff0c;使得它们的和正好是s。如果有多对数字的和等于s&#xff0c;输出任意一对即可。 代码如下: bool FindNumbersWit…

数字化演化历史

回顾历史&#xff0c;帮助我们展望未来&#xff0c;在数字化技术出现之前&#xff0c;人类历史几千年的历史中&#xff0c;人类社会中&#xff0c;人类的大脑是唯一可以作信息处理的。比如我们发明了汽车&#xff0c;需要人来开车&#xff1b;发明了飞机&#xff0c;需要人来驾…

数据结构与算法--字符串:字符串替换

数据结构与算法–字符串&#xff1a;字符串替换 字符串的优化 由于字符串在编程时候使用的评率非常高&#xff0c;为了优化&#xff0c;很多语言都对字符串做了特殊的规定。下面我们讨论java中字符串的特性java中的字符数组以’\0’ 结尾&#xff0c;我们可以利用这个特性来找…