例如:链表:1->2->3->4->5->6->7->8->null, K = 3。调整后:3->2->1->6->5->4->7->8->null。

其中 7,8不调整,因为不够一组。

LeetCode25,这里用的是分别递归的思想:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// k个为一组逆序
public ListNode reverseKGroup(ListNode head, int k) {
ListNode tail = head; // 遍历K-1次,直到当前组的tail(newHead)
for (int i = 1; i < k && tail != null; i++) {
tail = tail.next;
}
if(tail == null) // 判断节点的数量是否能够凑成一组
return head;

ListNode t2 = tail.next;
tail.next = null;

// 把当前的组进行逆序
ListNode newHead = reverseList(head);
// 把之后的节点进行分组逆序,返回新的Head
ListNode nextNewHead = reverseKGroup(t2, k);

// 把两部分连接起来
ListNode newTail = head;
newTail.next = nextNewHead;

return newHead;
}

// 逆序单链表
// 返回新的头节点
private static ListNode reverseList(ListNode head) {
if(head == null || head.next == null)
return head;
ListNode result = reverseList(head.next);
head.next.next = head;
head.next = null;
return result;
}