链表经典面试题上

embedded/2024/10/18 16:54:30/

目录

创作不易,如若对您有帮助,还望三连,谢谢!!!

题目一:203. 移除链表元素 - 力扣(LeetCode)

题目二:206. 反转链表 - 力扣(LeetCode)

题目三:876. 链表的中间结点 - 力扣(LeetCode)

题目四:面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

题目五:21. 合并两个有序链表 - 力扣(LeetCode)

题目六:面试题 02.04. 分割链表 - 力扣(LeetCode)

题目七:160. 相交链表 - 力扣(LeetCode)

题目八:141. 环形链表 - 力扣(LeetCode)

拓展问题:


创作不易,如若对您有帮助,还望三连,谢谢!!!

之前我们学习了单链表,实现了单链表的一系列的功能,今天我们来讲解一下链表的一些经典面试题目,以便巩固我们对链表的理解。

话不多说,我们直接来看题目:

题目一:203. 移除链表元素 - 力扣(LeetCode)

我们看题目:给定一个单链表和头结点,让我们删除所有满足 Node.val == val 的节点,并返回 新的头节点 。

思路:创建新链表,遍历原链表,将原链表中值不为val的节点尾插到新链表中。我们之前在实现单链表功能中写过尾插的方法,所以这里就不在赘述,代码如下:

这段代码创建了一个新的带头单链表,并将原链表中满足条件的节点进行尾插,最后释放了dummy,防止内存泄漏。

那么,这段代码有问题吗?有什么问题呢?

有小伙伴会说:没有考虑链表为空的情况,题目说了链表可能为空。仔细看我们这段代码:当head为空时,不会进入while循环,最后返回NULL,没有什么问题,那么我们代码是正确的吗?我们先运行一下代码:

结果有问题,为什么最后一个值为6的节点没有被删除呢?我们回头看一下我们尾插的代码:

最后一步,pcur指向最后一个节点,节点的值为6,不满足条件,故pcur指向NULL,跳出while循环,但此时新链表最后一个节点(值为5)的next指针指向哪里呢?我们并没有修改它,所以它会指向原链表的最后一个节点,所以才会引发错误,所以我们只需要在while循环后加入一个 :newTail->next=NULL即可,修改后的代码如下:

题目二:206. 反转链表 - 力扣(LeetCode)

这一题同样提供两种思路:

思路一:创建新链表,遍历原链表,在新链表中进行头插操作,从而达到反转链表的目的。

思路二:定义三个指针,用三个指针遍历链表,在原链表上完成反转操作。

思路一我们之前也讲过头插,代码比较简单,我们主要讲一下思路二:

代码如下:

题目三:876. 链表的中间结点 - 力扣(LeetCode)

这里的思路是快慢指针:创建两个指针,慢指针一次走一步,快指针一次走两步,最后快指针走到尾时,慢指针指向的节点就是中间节点。

思路示意图如下:

那么我们肯定要写一个循环,循环结束条件是什么呢?看上面的示意图,我们可以得出是:

fast不为空,并且fast->next不为空,代码如下:

注意:循环判断条件不能交换位置,即写成:fast->next &&fast,因为当链表节点个数为奇数时,最后fast为NULL,改变顺序不就变成对空指针解引用了吗?

题目四:面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

 

思路:快慢指针,两个指针初始相差k步,最后fast指向NULL时,slow指向的就是链表倒数第k个节点。思路示意图如下:

代码如下:

题目五:21. 合并两个有序链表 - 力扣(LeetCode)

思路:创建一个新链表,遍历原来两个链表,将两个链表节点的值进行比较,值晓得节点尾插到新链表

代码如下:

这段代码要注意的一点是:出了while循环后有两种情况:要么是list1为空,要么是list2为空,所以我们要连接不为空的链表

题目六:面试题 02.04. 分割链表 - 力扣(LeetCode)

思路:创建两个带头链表,一个小链表,一个大链表

把原链表中值小于x的节点尾插到小链表中,把原链表中值大于x的节点尾插到大链表

最后,把小链表的尾连接到大链表的第一个有效节点上。

代码如下:

仔细看看上面代码,看看有没有问题?

看似没有什么问题,我们来运行一下:

这是为什么呢?我们来分析一下:

最后我们的代码运行结果为上图所示,这时有一个问题:大链表最后一个节点的next指针指向谁呢?我们并没有改变它的next指针,所以他指向的是小链表中的最后一个节点,示意图如下:

这不变成带环链表了吗?所以才会超出时间限制,我们只需要把大链表的最后一个节点指向NULL,即可,代码如下:

题目七:160. 相交链表 - 力扣(LeetCode)

思路:先遍历两个链表,记录两个链表的节点个数m,n

然后通过尾节点是否相等来判断两个链表是否相交,因为两个链表只要相交,尾节点必定为同一个。

最后快慢指针,快指针比慢指针多走m--n的绝对值步,从而找到第一个交点。思路图如下:

代码如下:

题目八:141. 环形链表 - 力扣(LeetCode)

首先,我们先说思路:快慢指针,快指针一次走两步,慢指针一次走一步

链表有环,必能在环中相遇。

代码如下:

那么,为什么有环的话,快慢指针一定会在环中相遇呢?讲解在下图:

这不就变成追击相遇问题了吗?fast速度相当于2,slow速度相当于1,两者距离为△x,变换参考系,以slow为参考系,fast相对速度为1,所以一定能追上。

拓展问题:

如果fast一次走3步,4步....n步,还一定能在环中相遇吗?

我们在下篇文章中接着讲解这个问题。


http://www.ppmy.cn/embedded/29106.html

相关文章

音频智能切换器JR-AR42-A

憬锐JR-AR42-A音频自动智能切换器(四切一),具备四路模拟卡侬立体声音频输入,两路模拟卡侬立体声音频输出,其中输入第1路和输出第1路为断电直通通道。具有输入音频信号幅度判别,可设置门限电平和切换延时时间,可以根据需…

librosa 语音识别 学习笔记

目录 不错的功能介绍 librosa安装 语音识别 不错的功能介绍 librosa,一个很有趣的 Python 库! - 简书 音频转特征向量 GitHub - librosa/librosa: Python library for audio and music analysis librosa安装 2024.04.27 测试ok Win11系统 pip in…

python验证输入的IP地址是否正确

目录 一.前言 二.代码 三.代码分析 一.前言 IP是一组规则,它定义了计算机网络中的设备如何通信。它是一套协议,规定了如何将数据包从一台设备发送到另一台设备。 二.代码 cause = True # 设置判断网址是否正确的标志变量为真 ip …

SAP PP学习笔记09 - 作业区(工作中心Work Center)Customize2(管理码,班次顺序,计算式),标准Text,作业区阶层

上文讲了作业区(工作中心)的概念及其中重要字段,以及作业区的部分Customize。 SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize-CSDN博客 本文继续讲 作业区的Customize。 Spro > 生…

K8S执行完毕kubectl init xxx 执行 kubectl get ns 报错才connect: connection refused

问题场景: 在安装完毕K8S之后,执行 kubectl get ns 报错: [rootmaster ~]# kubectl get pods E0501 08:34:55.770030 11268 memcache.go:265] couldnt get current server API group list: Get "https://192.168.1.100:6443/api?ti…

云计算技术概述_1.云计算相关概念

1.关于IBM“蓝云(Blue Cloud)”计划 IBM 推出的“蓝云(Blue Cloud)”计划为客户带来即可使用的云计算(Cloud Computing)。它包括一系列的云计算产品,使计算不仅仅局限在本地机器或远程Server Farms&#…

从格力高事件谈SAP项目质量管理

最近我相信大家都听说了格力高SAP项目上线后因为某些原因系统不能出货的事故,对于格力高这么一家著名的食品公司来说,无疑是非常严重的问题。对于本次事件的解读,大家可以参考各路业内人士的文章或者视频。今天我想借这个话题,聊一…

与Apollo共创生态:迈向智能驾驶的未来之路

一、前言 在百度Apollo七周年大会的北京车展前夕成功举办,我们迎来了一场智能汽车未来的思想盛宴。以“破晓•拥抱智变时刻”为主题的盛会上,百度Apollo发布了一系列激动人心的智能驾驶产品,涵盖领航辅助驾驶、智能座舱,以及基于文…