-
判断是否有环,如果有环,找到环入口点
- 使用 快慢指针
-
找到链表的中间节点
- 中间偏右节点 使用快慢指针,正常下 slow指向的为中间偏右节点
- 中间偏左节点 额外添加一个指针prev,指向slow的父节点,则prev指向中间偏左节点
-
找到链表的倒数第N个节点
- 也是使用快慢指针,fast先走 N-1步, 之后一起走
-
合并排序链表
- 链表数量为2时,正常合并,即merge(ListNodel,ListNoder)
- 当链表数量为K时,采用最小优先队列 priority_queue<ListNode*,vector<ListNode*>,CMP>,时间复杂度为O(nKlogK)
-
翻转链表
- 完全翻转
- 递归
- 非递归
- 翻转前N个节点
- 递归
- 非递归
- 翻转[M,N]内的节点
- 递归
- 非递归
- 完全翻转
-
使用哨兵dummy节点做头,简化编程,比如链表相加之类
-
K 个一组反转链表,也是使用递归
-
下一个更大的数,采用单调栈,但是需要从右往左遍历,所以采用递归方式,把单调栈作为参数传入,返回是当前节点从右边开始的索引
-
两两交换节点,采用递归方式,其实就是K个一组翻转链表的特例
-
旋转链表或者移动链表,也都是需要找到链表,翻转
-
删除重复元素,也是采用哨兵
-
链表排序,
- 归并排序
- partition 使用快慢指针找到中间节点,断开
- sort 递归排序
- merge 合并2个有序链表
- 插入排序
- 麻烦在于向前遍历,可以采用 1<-2<-3… 的形式,最后在翻转
- 归并排序
-
回文链表 需要翻转后半部
-
奇偶链表 采用哨兵节点
-
分割链表 采用哨兵节点
-
删除链表节点
- O(1) 删除非尾部节点
- O(n) 删除任意节点
-
链表相交
链表操作相关考点及技巧
最新推荐文章于 2023-05-27 09:48:08 发布