链表经典面试题上

目录

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

题目一: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.mfbz.cn/a/589290.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑如何查看一段时间内是否被人使用过?

前言 有时候我们可能会担心别人未经许可使用我们的电脑。为了确保自己不在场时电脑是否被使用过,以下两种方法可能会帮到你 第一种方法 WinX打开事件查看器。像WinX能快速打开很多东西,比如安装的应用(可以进行软件的删除),设备管理器&…

网络性能测试工具iperf3 和iperf

目录 1. iperf工具介绍 2. 下载安装 3. 使用方法 1. iperf工具介绍 iperf 是一个网络性能测试工具,用于测量网络带宽和性能。它可以在客户端和服务器之间进行数据传输,并提供了丰富的选项来配置测试参数和输出格式。 iperf 和 iperf3 都是用于测量网…

什么是发售?

什么是发售? 很多人不知道什么是发售,因为这个词刚被广而告之,在这里普及一下什么是发售? 发售,它是通过一套流程,把你的产品疯狂大卖的一种技术。通常有三个步骤,就是造势、预售、发售。那么这三个词怎么理解呢? 第一步:造势 造势的核心是引发关注,但是不做销售…

【机器视觉】Segment Anything模型(SAM) C# 推理

Facebook开源的Segment Anything是一个基于大型预训练模型的计算机视觉工具,它使用一种新的范式来处理图像分割任务。这个范式不依赖于传统的预训练加微调(pretrainfinetune)方法,而是通过提示(prompt)加上…

关于我转生从零开始学C++这件事:升级Lv.10

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载,请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主,代码兴国!❤❤❤ 盘古开天辟地,大伟五一更新。大家好哇,大伟今天继续给大家来更新我们的C:…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑: 接下来看查询缓存代码实现,主要是捋清楚业务逻辑,代码实现是死的: Controller: Service: P37作业实现:总体逻辑跟上面的业务逻辑差不多 Controller: Service&#…

MATLAB 代数

MATLAB 代数 到目前为止,我们已经看到所有示例都可以在MATLAB及其GNU(也称为Octave)中运行。但是,为了求解基本的代数方程,MATLAB和Octave几乎没有什么不同,因此我们将尝试在单独的部分中介绍MATLAB和Octa…

【linuxC语言】获取进程信息

文章目录 前言一、getrusage函数二、示例代码总结 前言 在Linux环境下,了解和获取进程的信息对于系统监控、性能优化以及调试等任务至关重要。C语言作为Linux系统编程的主要语言之一,提供了丰富的系统调用和库函数,可以帮助我们轻松地获取进…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代,机器学习以其强大的学习和预测能力,成为了推动科技进步的重要力量。而在机器学习的背后,数学原理,尤其是导数的应用,为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

职场商务口才能力精品课

职场商务口才能力精品课(3篇) 以下是关于职场商务口才能力的三篇精品课内容概述: **篇:基础篇——商务口才的基石 课程主题:商务口才的基础技能与心态建设 内容概要: 商务口才的重要性:首先强…

告别JSON慢时代!Msgpack:数据传输界的隐秘加速器 eksposed!

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

ThreeJS:坐标辅助器与轨道控制器

ThreeJS与右手坐标系 使用ThreeJS创建3D场景时,需要使用一个坐标系来定位和控制对象的位置和方向。 ThreeJS使用的坐标系是右手坐标系,即:X轴向右、Y轴向上、Z轴向前,如下图所示, ThreeJS-右手坐标系 Tips:…

鸿蒙学习1概况

鸿蒙学习1相关概念 前言相关概念Stage 模型1. AbilityStage2. UIAbility组件和ExtensionAbility组3. WindowStage4. Context 事件传递UIAbility组件与UI的数据同步UIAbility组件间交互(设备内) 进程模型线程模型 前言 有时间多看官网,官网的…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

如何彻底删除python

点击菜单栏中的“开始”&#xff0c;打开“运行”。 在运行上输入“cmd”&#xff0c;点击“确定”&#xff0c;接着输入“python --version”&#xff0c;得到一个程序的版本。 然后到这个网上下载对应的程序的版本&#xff0c;接着点击这个版本软件&#xff0c;点击这个卸载。…

java入门-日期类

日期类 Date类 Date类表示特定的时间&#xff0c;可以精确到毫秒。 获取Date对象 Date date new Date(); 构造方法 /*** Allocates a <code>Date</code> object and initializes it so that* it represents the time at which it was allocated, measured to…

WebStorm2024版 将项目上传到gitee

目录 一、准备 WebStorm gitee 二、上传代码到Gitee 三、过程中遇到的问题 报错&#xff1a;You may want to first integrate the remote changes (e.g., git pull ...) before pushing again. 报错&#xff1a;fatal: refusing to merge unrelated histories 报错&a…

Linux深入学习内核 - 中断与异常(下)

软中断&#xff0c;Tasklet和Work Queue 由内核执行的几个任务之间有一些不是紧急的&#xff0c;他们可以被延缓一段时间&#xff01;把可延迟的中断从中断处理程序中抽出来&#xff0c;有利于使得内核保持较短的响应时间&#xff0c;所以我们现在使用以下面的这些结构&#x…

【linux】进程间通信(匿名管道)

对于本篇文章我们采取三段论&#xff1a;是什么 为什么 怎么办。 目录 进程间为什么要通信&#xff1f;进程间如何通信&#xff1f;进程间怎么通信&#xff1f;匿名管道&#xff1a;匿名管道原理&#xff1a;代码示例&#xff1a;匿名管道的情况与特征&#xff1a; 进程间为什…

双指针(C++)

文章目录 1、移动零2、复写零3、快乐数4、盛最多水的容器5、有效三角形的个数6、和为s的两个数7、三数之和8、四数之和 需要理解的是&#xff0c;双指针并非只有指针&#xff0c;双指针的意思是两个位置。比如对于数组来说&#xff0c;两个下标也是双指针。当然&#xff0c;也可…