数据结构(长期更新)第5讲:单链表算法题

数据结构(长期更新)

第5讲:单链表算法题

++跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学++ ++习内容,你的支持就是博主最大的动力++ 。博主主页:潼心1412o-CSDN博客


目录

前言

[5.1 移除链表元素](#5.1 移除链表元素)

[5.2 反转链表](#5.2 反转链表)

[5.3 链表的中间结点](#5.3 链表的中间结点)

[5.4 合并两个有序链表](#5.4 合并两个有序链表)

[5.5 链表的回文结构](#5.5 链表的回文结构)

[5.6 相交链表](#5.6 相交链表)


前言

上节课我们学习了单链表的基本操作,下面我们来进行实战吧,gogogo,出发喽!

5.1 移除链表元素

https://leetcode.cn/problems/remove-linked-list-elements/description/

方法一:遍历链表,发现一个删一个SLTErase

时间复杂度为O(n^2)

方法二:创建一个新链表

不是val就尾插SLTPopback

注意这里并没有真的申请额外的空间创建新链表,而只是创建了两个新指针,改变了指针的指向,

利用的还是原有的节点,所以并没有空间换时间,时间复杂度为O(1)

5.2 反转链表

https://leetcode.cn/problems/reverse-linked-list/description/

方法一:遍历原链表,头插新链表SLTPushfront

方法二:三个指针

创建三个指针n1,n2,n3

在前面两道题试错的过程中,我们需要格外注意空链表和空指针的情况

只要涉及指针成员的访问

即看到两个指针成员访问操作符->和.

就要注意是否会涉及空指针的访问情况

还有就是尾节点next指针是否置空

5.3 链表的中间结点

https://leetcode.cn/problems/middle-of-the-linked-list/description/

方法一:先求一个链表长度SLTSize,再访问中间节点

方法二:快慢指针

慢指针走一步,快指针走两步

5.4 合并两个有序链表

https://leetcode.cn/problems/merge-two-sorted-lists/description/

方法一:遍历l1,和l2比较,指定位置插入SLTInert,时间复杂度O(N^2)

方法二:l1,l2,l3分别遍历两个链表,小的尾插新链表

这里出现了代码冗余的问题

分析其根本原因是需要不停地判空

如何解决?封装函数判空治标不治本

我们可以让链表不可能为空,即加入哨兵头节点,这样就只需要在开始判断list1,list2是否为空

不用每放一次,就判一次当前新链表是不是空,造成空指针访问成员的情况

需要注意的是,newtail,newhead最开始只是申请了一个节点,两个指针,不过是在newtail此节点后指向原有链表的节点,创建新链表,去并没有浪费空间

最后malloc申请的空间还要还回去,并将newhead置空

5.5 链表的回文结构

https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

我们看到这道题目已经明确规定了空间复杂度

方法一:投机取巧法

创建一个数组来存储,反正链表最大长度不超900,那给一个arr[900]就ok

然后再两个指针遍历数组,一前一后比较

方法二:找到中间节点并反转中间节点为头的链表

两个链表逐个比较

5.6 相交链表

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

先分析题意,链表是否相交,有哪几种情况?发现只有尾节点相同的三种情况

(即相交位置在链表最前 中 最后)

然后解决问题 如何找到交点?

如果交点前长度相同,那么两链表同时遍历n次当next相同可找到

不同就需要计算其长度差

所以整理思路如下:


++好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~++

博主主页:潼心1412o-CSDN博客

相关推荐
小十一再加一9 小时前
【数据结构初阶】单链表
数据结构
ZIM学编程11 小时前
「学长有话说」作为一个大三学长,我想对大一计算机专业学生说这些!
java·c语言·数据结构·c++·python·学习·php
子枫秋月13 小时前
单链表实现全解析
c语言·数据结构·c++
刀法自然13 小时前
栈实现表达式求值
数据结构·算法·图论
Yupureki14 小时前
从零开始的C++学习生活 19:C++复习课(5.4w字全解析)
c语言·数据结构·c++·学习·1024程序员节
ゞ 正在缓冲99%…15 小时前
leetcode1312.让字符串成为回文串的最少插入次数
数据结构·算法·leetcode·动态规划·记忆化搜索
laocooon52385788616 小时前
寻找使a×b=c成立的最小进制数(2-16进制)
数据结构·算法
一匹电信狗20 小时前
【牛客CM11】链表分割
c语言·开发语言·数据结构·c++·算法·leetcode·stl
不染尘.20 小时前
图的邻接矩阵实现以及遍历
开发语言·数据结构·vscode·算法·深度优先