数据结构(长期更新)
第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博客