链表经典题目学习笔记
链表操作类
-
删除节点:对于这类题目可以将数组中的双指针思想对应搬过来,由于是将特定的节点进行删除,可以反过来思考,新建一个链表,只取非特定的节点,对应的特征是指明特定的节点。
附上例题:
[“删除链表中等于给定值 val 的所有结点”](https://leetcode-cn.com/problems/remove-linked-list-elements/description/
对应解法:双指针筛选法
-
新建链表:总的来说这类题目是根据原链表进行一个调整,我们可以根据要求利用双指针进行筛选,将合适的节点比较一下,放入新建的节点,即利用双指针筛选法。
附上例题:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成
对应解法:双指针比较法
特征对应:有序+新建列表
对应解法:双指针比较法+列表合并
特征对应:新建链表+比较大小
-
链表反转:朴实无华的掉头。
附上例题:
对应解法:链表反转
-
完全拷贝:这类问题的难点在于位置的多变性,如果能够确定位置,那么思路便清晰了。我们能够直到原链表的位置,那么我们就可以利用同样可以确定的相对位置去找到多变的位置。
附上例题:
给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中的任何结点或空结点
对应解法:相对复制法
特征对应:可知的定位点和相对距离
链表判断类
-
对称结构:在数组中,我们可以利用双指针从两头进行遍历,进行判断,可是链表是单向的,只有这一个条件是缺失的,那么我们把这个条件转化成可利用的条件,利用链表反转法将一半进行反转便可以进行判断了。
附上例题:
对应解法:反转法+双指针相行法
特征对应:链表的单向性+判断
-
环形链表:要判断一个链表是否是环形链表,可以想到进行标记,如果一个节点重复出现了两次,那么也就意味着这是环形链表,但是如何判断一个节点重复出现两次,可以利用双指针进行判断,两个指针的标记重复,也就意味着在同一时间内达到一个节点,由于环的特性可以联想到跑圈,这就转换为追及问题了,那么就利用快慢指针进行标记。
附上例题:
对应解法:快慢指针法
特征对应:复位性+双标记
寻找节点类
-
相对第K个节点类:这一类的题目重点在于相对位置的判断,找到了相对位置,那么我们就可以利用相对的思想,对节点的实际位置进行定位。
附上例题:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点
对应解法:快慢指针法
特征对应:已知相对位置和停止点
-
相交链表:对于相交的链表,可以自然想到两个指针从两边开始出发,触碰到一起时就代表到达了相交的节点,此时返回即可,但问题在于这是极端的情况,两边的长度相等,实际情况下两边的长度不太可能相等,因此两个指针存在距离差,那么让距离差消失就好了,可是我们并不知道距离差是多少,因此还要遍历链表并计数,看两个指针走完的距离差。
附上例题:
对应解法:双指针齐同法
特征对应:多个链表指向同一链表+双标记+相对位置可求
-
环形链表:对于环形链表,第一步就是判断,这在之前已经叙述过。同样是找第一个共节点,我们可以看到,有多个链表指向同一个节点,并且可以想到用双指针进行标记,这样的特征满足了之前找相交链表的部分特征,可是相对位置不可求,因为这是一个环形链表,无法停下,不可通过遍历获取长度,那么要解决的就是停下的问题,因此可以破坏这个环形链表,让其变成一个相交链表。
附上例题:
对应解法:快慢指针法+双指针齐同法
特征对应:复位性+多个链表指向同一链表+双标记+相对位置可求
对于此题,还有另一种更为完整的步骤,这要从头开始:
对于快慢指针,有距离关系:
2 S s = S f S f = L + x C + N S s = L + N 2S_s=S_f \\ S_f = L+xC+N\\ S_s=L+N 2Ss=SfSf=L+xC+NSs=L+N
S分别代表快慢指针的距离,L是非环链表的长度,C是环的长度,N代表慢指针在环上行走的距离。将其代入可得
2
(
L
+
N
)
=
L
+
x
C
+
N
L
=
x
C
−
N
2(L+N)=L+xC+N\\ L=xC-N
2(L+N)=L+xC+NL=xC−N
如果把这两边视为要走的距离,那么在头节点和fast和slow相交的节点分别置下新的指针,那么这两个新的指针在相遇的时候所需要走的距离是一样的,那么接下来的步骤也就呼之欲出了。但如何想出来要这么做呢?这其实和上面的解法是一样的,关键在于求相对位置这一过程,有了求相对位置这一意识,也就有了上面的推导,那么,是不是所有的找节点问题都可以利用相对位置这一意识呢?