概要
简述
- 如果遇到多个单链表,那么大概率是需要使用双指针,要么就是优先级队列
- 链表遍历框架,兼具线性和非线性遍历结构
- 可以用循环遍历,也可以递归遍历
- 所以可以思考一下,除了遍历还能用递归解题
题型总结
- 反转链表题型
- 判断是否回文链表
- 合并两个有序链表
- 合并k个有序链表
- 寻找单链表的倒数第k个节点
- 寻找单链表的中点
- 判断单链表是否包含环并找出环起点
- 判断两个单链表是否相交并找出交点
反转链表
反转一个单链表
- 反转链表过程中需要存储变量,代表两个链表,一个是已经反转的链表,一个待翻转的链表
- 记得对于开始时,已经反转的链表是null,还有一个带翻转的链表
对一个单链表位置m到位置n进行反转
分组翻转
- 因为要求如果不满足分组个数,则不进行翻转,所以就必须先分组再翻转
- 递归和循环都能做
判断是否回文链表
回文链表特性
- 回文串/回文链表,就是正者念反着念一模一样
- 利用这个特性,可以反转回文串/回文链表,然后进行同时对两个串/链表遍历,逐一比对
- 具备对称的属性
- 利用这个特性,可以从中间向两边进行逐一比对
- 对于单向链表,因为无法逆向遍历,那么可以把其中一半翻转完再进行对比
做法
- 如果基于正反念一样的特性,那么可以使用递归然后对链表进行逐一比对
- 如果基于对称的特性,那么可以找到中点,然后翻转后半部分再进行对比
合并两个有序链表
思路
细节
合并k个有序链表
思路
- 在多个链表头取最小的节点组成链表
- 关键是怎么比对最小的节点
- 利用链表节点进行排序
- 利用数组结构进行排序
- 循环所有节点进行比较
寻找单链表的倒数第k个节点
思路
寻找单链表的中点
思路
判断单链表是否包含环并找出环起点
是否包含环的思路
- 快慢指针遍历
- 如果不含环,那么不会遇到null
- 如果指针节点一样,说明两个指针在环里面相遇了
找环起点
- 快慢指针相遇后,两个指针同步移动速度,一个从起点出发,遇到就是环起点
判断两个单链表是否相交并找出交点
思路
- 如果链表相交,那么两链表长度为a+c,b+c
- 那么,可以双指针遍历,当遍历完自己的链表再遍历对方的链表
- 那么长度分别为a+c+b+c b+c+a+c
- 因为a+c+b=b+c+a以及a+c+b+c=b+c+a+c
- 所以如果完整遍历完会有两次相遇的机会,第一次就是在c节点的位置,也就是交点
- 如果不想交,那么两链表长度为a,b
- 因为a+b=b+a,所以遍历完没有相交,那么就是没有交点
注意
- 切换的对方的链表,如果是用null节点来跳的
- 那么可以利用相遇的时候,是否为null节点来判断有没有相交
posted @
2022-09-09 02:39
躲在墙角的
阅读(
14)
评论()
编辑
收藏
举报