目录
1.题目描述
难度:困难
给你链表的头节点 head
,每 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]
提示
- 链表中的节点数目为
n
1 <= k <= n <= 5000
0 <= Node.val <= 1000
2.题目解答
方法一:递归
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// k=1时不需要翻转
if (k == 1) {
return head;
}
ListNode end = head;
for (int i = 0; i < k-1; i++) {
// 如果子链表的长度小于k,不需要翻转
if (end == null || end.next == null) {
return head;
}
end = end.next;
}
// 翻转头部长度为k的子链表时,需要把该子链表与后续的部分断开
// 翻转前需要记录子链表的后继节点
ListNode temp = end.next;
end.next = null;
// 子链表翻转后的头节点
ListNode newHead = reverseList(head);
// 翻转后,子链表原来的头节点变成了尾节点,需要与后续部分重新连接
head.next = reverseKGroup(temp, k);
return newHead;
}
private ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}