给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
- 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]
示例 2:

输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1输出:[1]
提示:
列表中节点的数量在范围
sz内1 <= sz <= 50000 <= Node.val <= 10001 <= k <= sz解法一:递归
func reverseKGroup(head *ListNode, k int) *ListNode {if head == nil {return head}a, b := head, headfor i := 0; i < k; i++ {// 当下一个节点不存在,表示不足 k个节点了,可以直接返回当前头结点即可if b == nil {return head}b = b.Next}// 反转 [a,b) 这时候 b 前面一个节点是头结点,a 是末尾节点newHead := reverse(a, b)// 将后面的结果添加到当前链表的后面即可a.Next = reverseKGroup(b, k)return newHead}// [left, right) 前闭后开 反转固定区间的链表func reverse(left *ListNode, right *ListNode) *ListNode {// 不包含 right 节点if left.Next == right {return left}last := reverse(left.Next, right)left.Next.Next = leftleft.Next = nilreturn last}
