问题描述
给你一个链表,每个链表上的节点数目为 n
,请你将链表的每个 k
个节点反转,返回反转后的链表。
如果节点总数不是 k
的整数倍,那么请将最后剩余的节点保持原有顺序。
进一步说明:
- 链表中节点的数目在范围
[1, 5000]
内 0 <= Node.val <= 1000
1 <= k <= 2000
示例
输入: head = [1,2,3,4,5], k = 2
输出: [2,1,4,3,5]
解释: 节点总数为 5,不是 2 的整数倍,因此最后剩下的一个节点保持原有顺序。
分治策略
分治策略,其中“分”是指将链表分成多个长度为 k 的部分,而“治”则是对每部分应用翻转操作。这样,可以高效地在单链表上实现复杂的数据重组,而不需要额外的空间开销(即空间复杂度为 O(1)),因为所有操作均在原链表上就地完成。
要求对链表中的节点进行局部翻转。主要思路是:
- 遍历链表,计算链表长度
n
。 - 对链表的每个
k
个节点进行翻转操作。如果链表剩余节点少于k
个,则不进行翻转。 - 使用一个虚拟头节点简化边界处理,保持对翻转链表头部的引用。
- 使用三指针法(pr