反转链表
-
反转链表 -- done
-
反转子链表 -- done
- 要求:反转链表的某一段
- 解题思路:将链表分为三部分,第一部分为 left 之前的;第二部分为 left 到 right;第三部分为 right 之后的。
- 找到第一部分的尾节点,注意可能为空;第二部分的头节点,反转后是头节点。
- 反转第二部分链表
- 第二部分链表的头接第一部分的尾节点,尾接第三部分的头节点。注意,如果第一部分链表的尾结点为空,那么第二部分链表的头就是新的头
- 时间复杂度:O(N),N 是链表长度
- 空间复杂度:O(1)
-
24. 两两交换链表中的节点 -- ing
-
25. K 个一组翻转链表 -- done
- 第一个 k-sized 子链表的 prev 为空,需要重新设置头节点
- 最后一个子链表不足 k-sized,可以再次反转。效率问题:链表比较长的情况下,效率高。
-
1721. 交换链表中的节点 -- ing
-
2074. 反转偶数长度组的节点 -- ing
-
Reverse alternating K-element Sub-list -- done
- 每隔 k 个节点翻转一个 k 个节点的链表
-
61. 旋转链表 -- done
-
列表中的每个节点向右旋转 k 个节点
-
-
知识点速记(心中要有图):
- 找到链表的第 n 个节点,需循环 n - 1 次。因为第一个节点是头节点,不需要循环。
- 反转 n 个节点的链表,需循环 n 次。因为需要从头节点开始反转。
- 找到链表的末尾节点。关键点,末尾节点的 next 指向空。同时可计算链表长度,注意长度从 1 开始。
- 加个哨兵头节点,可以减少条件特判。