当前位置: 首页 > news >正文

链表算法题

前面我们学习了数据结构的顺序表和链表部分,所以这里我们来看几道题目巩固一下

目录

前言

练习1:合并两个有序数组

练习2:移除元素

练习3:反转链表

练习4:移除链表元素

练习5:链表的中间节点

练习6:环形链表的约瑟夫问题

练习7:合并两个有效链表

练习8:轮转数组

练习9:消失的数字

练习10:返回倒数第K个节点

练习11:链表的回文结构

练习12:相交链表

练习13:随机链表的复制

练习14:环形链表1

拓展:

练习15:环形链表2

总结:


前言

这里我们所解析的题目基本上是来自力扣或牛客网,也推荐大家在学习这部分内容时最好搭配习题。博主这里也建议大家在看每道题的解析时最好搭配上博主画的简易的思维图一起,会更容易理解。


练习1:合并两个有序数组

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/merge-sorted-array

我们在拿到这一题的时候会发现这是两个非递减数组的合并,我们有两种思路。第一是把数组2直接插到数组1的后面然后进行排序。第二是利用数组1的空间和两个数组都是递增的情况,从数组有效数字的地方逐个进行比较然后从数组1的最后开始插入。

我们还有注意可能遇到的特殊情况,当数组1的有效数字部分都已经插入完(L1已经为0),数组2中的数字不要忘记移到数组1中。

练习2:移除元素

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/remove-element

我们拿到这一题会发现它需要我们返回不等于val元素的数量,我们的思路是找两个指针同时指向起始位置,一个指针(str)遍历数组等于val的元素直接跳过,不等于的就赋值给另一个指针(bra),然后bra+1,最后返回bra的值

练习3:反转链表

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/reverse-linked-list

我们可以通过下面的示例图来理清思路,所谓的反转链表实际上就是让每个节点的next指针从指向后一个节点变成指向前一个节点。因此我们只需要简单进行一个转向就可以了。

我们需要三个指针来操作,l2->next指向l1,再进行移动l1移动到l2,l2移动到l3,l3移动到l3->next。同时我们还要注意l3进行移动时要判断其是否已经指向NULL,还有链表为空的情况(head=NULL)。

练习4:移除链表元素

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/remove-linked-list-elements

我们拿到这题的思路是创建一个新链表,遍历旧链表不等于val的节点拿到新链表中(注意链表为空的特殊情况),等于val的节点直接释放,最后要注意把尾节点的next置为NULL

练习5:链表的中间节点

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/middle-of-the-linked-list

这个题目不太难但是涉及到一个快慢指针的思想,我们创建两个新指针都指向头节点,但是慢指针一次走一步,慢指针一次走两步,我们可以看到下面两种情况:奇数个数时快指针走到尾节点,慢指针到中间节点。偶数个数时快指针走到NULL,慢指针走到中间节点。

练习6:环形链表的约瑟夫问题

这是题目内容,如果想自己尝试,链接:https://www.nowcoder.com/share/jump/8889611841761481242643

这个题目我们刚看到可能有两种思路,用数组填充n个元素像1,2,3,4……一样,然后利用下标把每个离开的元素置为0,最后找到剩下的元素,但这种思路实现起来相对麻烦。所以我们还有第二种思路就是使用单链表,把n个节点首尾相连成一个环形链表,再通过计数器把计数为m的节点释放。我们要先创建环形链表(先创建一个头节点,再根据n创建剩余节点,最后让首尾相连),再遍历节点(计数为m的释放,不为m的pcur和pver向下走),最后pcur=pcur->next时结束。

最后有一点我们需要注意的是创建完环形链表后要返回尾节点tail,因为通过tail可以很好找到head,但通过head找到tail很麻烦。

练习7:合并两个有效链表

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/merge-two-sorted-lists

我们在看到这题时会感觉和练习1有些类似。我们的思路是创建一个新的链表,在找两个指针不断遍历两个链表,一边遍历一边比较,要特别注意链表为空的情况和其中一个链表遍历完成了,另一个要加在新链表的后面

练习8:轮转数组

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/rotate-array

这题的解法有几种,我们可能第一时间会想到冒泡排序中的思路,但这里我们有一种更加巧妙的思路,就是不停转动数组。我们轮转的个数k可能会超过数组的个数n,所以对于实际产生转动效果的应该是n%k,我们先把整个数组反转,在分别反转前(k%n)个元素和其余的元素就达到了我们想要的效果。

练习9:消失的数字

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/missing-number-lcci

这个题目与其说是一个算法题其实更加像是一个数学题,直接计算0到N的所有数加在一起然后减去数组中所有数加在一起不就是消失的那个数了。

练习10:返回倒数第K个节点

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/kth-node-from-end-of-list-lcci

这题拿到我们可能有两种思路,把节点塞进数组解决,但还有第二种是我们前面题目所提到的快慢指针,这次我们让快指针先走k步,再让两个指针同时走,直到快指针走到空。

练习11:链表的回文结构

这是题目内容,如果想自己尝试,链接:https://www.nowcoder.com/share/jump/8889611841761619401328

这种类似的问题我们在数组中遇到过类似的,如果是数组的回文结构就简单很多,用两个指针一个从前往后另外一个从后往前,逐个对比。但单链表是没有办法从后节点找到前节点的,这里我们有一个比较巧妙的思路,就是用到之前的反转链表。

我们先找到链表的之间节点然后再反转后面的链表,最后让指针从链表的头节点和中间节点开始遍历,逐个对比。可能有人会对奇数个节点的情况有疑惑,如下图,可能会想head指针到2后,rmid指针也到2,到后面rmid指针可以指到3节点,那head指针该如何?其实这很简单,我们回归到链表中看,head指针到2节点是里面next指向的还是3节点。

练习12:相交链表

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/intersection-of-two-linked-lists

拿到这题我们通过观察可知,链表相交则它们的尾节点是同一个,想找到相交节点我们还是利用快慢指针的方法,得到两个指针的节点个数,让快指针先走长度差步,再一起往前移动并判断节点是否相同。注意我们在判断那条链表用快指针时用了一个假设法,先假设A链表长用快指针,如果不是再和B交换。

练习13:随机链表的复制

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/copy-list-with-random-pointer

我们再拿到这题的时候应该会感觉不太好处理,因为不仅是拷贝链表相当与它们之间的关系我们都要拷贝,所以这题会运用一个非常巧妙的方法。就是把拷贝的节点先插入到原链表中,这样我们可以发现random可以顺着连接,最后把拷贝的节点整合在一起。

练习14:环形链表1

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/linked-list-cycle

这题我们可以使用快慢指针(慢指针一次走1步,快指针一次走2步)解决,当慢指针言进入循环时,快指针和它的距离的N,它们的距离会越来越小(N,N-1,N-2......1,0)只要快慢指针相遇就说明链表是环形。

拓展:

这个问题不难,我们来拓展一下:如果slow走一步,fast走3步,那他们有没有可能不会相遇?

结论是肯定会相遇。

请跟着我的思路图进行思考,如果有不理解的部分可以在评论区或私信里问,这是一个与数学相结合的问题。

练习15:环形链表2

这是题目内容,如果想自己尝试,链接:https://leetcode.cn/problems/linked-list-cycle-ii

这题是上一题的一个进阶,判断是否环形我们就不多说了。想要找到那个节点我们有两种思路,一十找到快慢指针的相遇节点然后把它断开,这样就给问题转变成相交链表了,这个我们就不在多说了。二是与上一题拓展同样的与数学相联系。


总结:

大家可以看到我们在写这些算法题时经常要画图来帮助解决,这是一个很好的方法,可能在我画的图中感觉那么明显,这是因为画图思考是一个过程一张图片很难呈现出来,希望大家可以尝试一下。

制作不易,支持请三连


http://www.dtcms.com/a/540173.html

相关文章:

  • 织梦制作wap网站高端网站开发建设
  • 网站建设公司销售经理职责全网最大的精品网站
  • 怎么做公司网站推广cms网站开发教程
  • 解决 OpenSSL 3.6.0 在 macOS 上 Conan 构建失败的链接错误
  • metaRTC7 mac/ios编程指南
  • Go语言-->Goroutine 详细解释
  • 船舶终端数据采集与监管平台一体化方案
  • 2025年10月28日Github流行趋势
  • 《红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》 第14篇 | 6G畅想:通感一体、AI内生——下一代网络的愿景与挑战
  • 「Java EE开发指南」如何用MyEclipse设置Java项目依赖项属性?
  • 输电线路防外破在线监测装置是什么
  • MTK5G旗舰系列——天玑9500/9400/9300/9200/9000在AI和处理器性能、DDR频率及UFS的深度对比分析
  • 平板做网站服务器wordpress在线直播插件
  • 前端Jquery,后端Java实现预览Word、Excel、PPT,pdf等文档
  • 华为910B服务器(搭载昇腾Ascend 910B AI 芯片的AI服务器查看服务器终端信息
  • Spring JDBC实战:参数处理与嵌入式数据库
  • 图片转PPT:用Java高效处理PowerPoint的秘籍
  • Custom Animations for PPT (PowerPoint)
  • 沈阳网站哪家做的好做视频网站设备需求
  • 【数据工程】16. Notions of Time in Stream Processing
  • AOI在传统汽车制造领域中的应用
  • 搭建网站复杂吗微信公众号怎么做链接网站
  • 网站优化推广招聘wordpress后台打开超慢
  • Linux软件编程笔记三——标准IO(二进制)文件IO
  • 如何使用 TinyEditor 快速部署一个协同编辑器
  • pgsql常用函数
  • 企业落地 NL2SQL,需要的是 AI-ready data 和小模型
  • 最好的购物网站排名厦门的推广公司有哪些
  • PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
  • 外贸网站建设gif制作软件app