链表理论基础
- 链表有节点组成,每个节点有数据域(存储数据)和指针域(存储节点地址)。
- 链表在内存空间中分散存储,通过指针连接在一起。
- 链表的操作都是基于链表的遍历,链表的遍历通过指针在链表上的移动实现(一般从头节点开始)。
- 链表的分类:单向链表、双向链表、循环链表。
链表经典技巧
虚拟头节点
问题:操作链表存在一个问题就是操作当前节点时往往要找到前一个节点,但是头节点没有前一个节点。
初始解决方案:每次对应头节点的情况都要单独处理。
进阶方案:设置一个虚拟头节点,把虚拟头节点指向头节点。
在设计链表中,使用了虚拟头节点。
翻转链表
双指针法:利用双指针不断地把每个节点的next指向前一个节点,直到当前节点为空。
递归法:翻转操作相同,利用递归函数不断移动指针。
删除倒数第N个节点
- 先找出要删除的节点:设定双指针,先让一个指针走n步,另一个指针不动。然后让两个指针同时运动,直到快指针指向末尾。这时,慢指针指向的就是要删除的节点。
- 删除操作:改变next指针指向即可。
- 相关题型:删除倒数第n个节点
链表相交
- 分类讨论:分出相交和不相交两种情况。
- 表示相交:正确表示出相交的情况。
- 代码实现。
本题重点:
- 比较的是指针,因此表示相交时,要以指针相等来表示。
- 正确设置指针,需要设定两个指针分别从两个链表出发。
- 正确移动指针,当前链表移动结束之后在移动到另一个链表的开头继续移动。
- 指针或双指针在链表的操作中起着至关重要的作用
- 相关题型:链表相交
环形链表II
本题有两个问题需要解决:
- 判断是否有环形:设定快慢指针,不断移动,看指针是否会相遇。
- 找到环形入口:从判断是否时环形时的已知条件推导出入口距离相遇点和头节点的距离关系,然后根据这个关系去移动指针找到环形入口。
相关题型:环形链表II
总结
- 链表的操作中,指针至关重要,双指针使用的频率很高。
- 对于一些问题,需要进行数学推导,使用快慢指针通过题目要求找到满足题意得数量关系,然后用指针的操作表示出来。
- 在链表的相关题型中,大部分判断条件都是指针空还是非空、两个指针是否相等。而不是用单纯的存储数字的变量进行条件判断。