链表经典热门考题(上篇)

本篇文章对主要是对链表相关的知识的检验。文章一共分为上下两篇,上篇的难度相对来说比较的容易。下篇的难度会有所提升,文章所选的题目来源于牛客网力扣
语言:C语言
这些题目即使是自己实力的一个检测也会增加大家在链表部分的解题思维方式。
上篇一共给出五道题目,全部来源自力扣,题目难度全为简单,题目的链接在标题的第一行。

文章前言

写下这篇文章的原因是我个人觉得这些题目无论是对于正在学习数据结构的同志们 来说还是已经学完了的同志们,这些题目都会有很大的帮助,其中很多的题目也都是比较经典和热门的,故,写下此篇文章以作总结和分享。

移除链表元素

移除链表元素
不跳转的同志可以看一下下面图片中的题目要求,之后我直接给出解题的思路。
在这里插入图片描述
对于这道题目,我写了两种解法,带有头结点和不带头结点。我只讲一下不带头结点的解法,下去大家可以尝试一下带有头结点的解法。

好了,废话不多说我们直接开始分析题目。

有人说这题目简单啊,找到要删除的元素将它之前的结点链接到它后一个结点不就行了嘛!但是你忽略了一个问题,单链表是不能向后走的,又有人说了,那我增加一个指针记录下前一个位置不就好了吗,答案是可以的,但是比较复杂,要考虑很多的情况,所以我们采用另一种方法:将不等于val的元素链接到一个新的链表上,大家仔细的想一下,这个和我们在实现链表的尾插时是不是很相似,我们只需要遍历一遍链表,然后将不等于val的链接到一起,等于val时就跳过,然后再返回新的链表即可。

基本的思路出来之后,我们还需要考虑一个问题,那就是是不是用头结点来链接不等于val的元素,答案是都可以的,使用头结点的话就不需要去考虑链表头为空的情况,无脑尾插即可,而是用指针时,就需要考虑第一次插入的情况了,因为此时指针为空,只需要将地址赋值给指针即可,不需要进行尾插。

在这里插入图片描述
最后的if语句是为了应对原链表为空表的情况。

在这里插入图片描述

反转链表

反转链表
在这里插入图片描述
题目描述很简单,就是要将原链表反转过来。

思路跟上一道题目差不多也是分为两种情况,使用头结点和不适用头结点,这道题目我们对比第一道题目来看,第一道题目是要我们进行尾插。这道题目的就是从第一个元素开始头插,这个就完成了我们的反转。

这里我还是不适用头结点的解法,大家可以自己去尝试使用头结点解答。
在这里插入图片描述
在这里插入图片描述

链表的中间结点

链表的中间结点
在这里插入图片描述
对于这道题目我们就直接给出一种很常见的解法–快慢指针

所谓快慢指针就是,一个指针走的快,一个指针走的慢,具体的我通过动图的方式为大家演示。
先解释一遍大概意思,即我们创建一个fast指针和slow指针,慢指针走一步,快指针走两步。
在这里插入图片描述
当fast的next为空时,slow就正好走到了中间元素的位置 ,当然这是链表元素为奇数个的情况,那么我们再来看一下元素个数为偶数的情况。
在这里插入图片描述
当fast为NULL时,slow正好走到了中间元素的第二个元素,也是符合题意的,所以这里我们的循环结束条件就有两个。
在这里插入图片描述
在这里插入图片描述
快慢指针的思想应用很广,不仅仅在链表中有体现,大家可以去力扣上找相关的题目加深对这种思路的印象。

合并两个有序链表

合并两个有序链表
在这里插入图片描述
这题的思路和我们的第一第二题有相似之处,即在将元素链接起来之前,先将两个元素进行比较,然后取较小的一方先链接,以此循环。
在这里插入图片描述
对于这道题目我使用了头结点的方式进行解答,因为这会省去很多对于空指针的判断,当然不使用头结点也是可以的。

然后我们还要考虑一个问题,就是原链表为空表的情况,如果其中一个原表为空的话,直接返回另一个链表即可,如果两者都为空的话,返回NULL,这也为什么我们在最后要加上两个if语句判断的原因。
在这里插入图片描述
因为是使用了malloc开辟了一个新的头结点,所以在最后要将该空间释放掉,只返回其地址的即可。
在这里插入图片描述

相交链表

相交链表
在这里插入图片描述
这题的题目很长我只保留了有效的信息,就是让我们返回两个链表的第一个相交的位置,如果链表没有交点的话,就返回NULL。

因为是单链表,所以这题最好的解法就是让两个链表没相交之前的链表长度一样,这样我们就能通过判断两个结点的next是否相同来判断两者是否相交了。
在这里插入图片描述
如果交点之前的链表长度不同的话,是没法通过next来找出相交结点的。

我们可以先求出两个链表的长度,然后让长的链表先走两者长度的差值步,这样两个链表就能在同一起跑线上了。

在这里插入图片描述
最后的这道题目稍微的有一点的复杂,不懂的多看两遍。

over! 学无止境!家人们!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山忆874

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值