最近集中刷了一批链表的题型,在这里总结一下解题技巧,以及对应题目的解题思路。
解题思路并不会细致入微,主要是为了总结归类,并且希望用几句话来激发灵感,权当是没思路时的指引以及以后复习时的提纲了。
还有一些重要或者总会绕晕的经典题目,也在这里记录一下代码的实现逻辑。
一、链表题解的两个技巧
遇到链表相关的题,无论问题是什么,先要想想是不是可以用上以下的两个技巧。
-
哨兵节点
-
双指针
1、哨兵节点
哨兵节点是一个非常常用的链表技巧,在处理链表边界问题的场景下,可以减少我们代码的复杂度。主要解决的问题如下:
-
处理完一条链表后,需要返回这个链表的头结点。我们在一开始的时候使用哨兵节点(dummy),让它的 next 节点指向 head 节点。最后 return 时直接返回 dummy.next 即可。
-
在对链表进行插入或删除节点时,使用哨兵节点可以简化删除 head 节点或者向 head 前插入节点时的处理逻辑。
-
在某些遍历链表的时候,可能会需要同时记录 pre 节点。当你从 head 节点开始遍历时,head 是没有 pre 节点的(为null)。而此时引用哨兵节点,相当于帮助 head 节点初始化了一个 pre 节点,可以方便的解决 pre 节点为空的问题。
因为哨兵节点使用场景很广泛,所以在这里就不针对性的列出典型题目了。
2、双指针
双指针实在是太好用了,其实不止是链表,对于数组题来说,也是非常好用的技巧。
双指针的主要用法有以下几种:
-
两个指针在两条链表上行走
-
快慢指针,同时前进
-
前后指针,前指针先走 n 步,之后两个指针同时前进
两个指针在两条链表上行走
有时,你需要将两条链表合并成一条链表,或者要将一条链表拆分成两条链表。此时,需要用两个指针分别在两条链表上行走,并处理逻辑。
典型题目: