Poison

25. Reverse Nodes in k-Group

Recursion
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
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 1 2 3 4 5, when k == 3

ListNode curr = head;
for (int i = 0; i < k - 1 && curr != null; i++) {
curr = curr.next;
}
if (curr == null) {
// 不足 k 个无需翻转,curr 停留在第 k 个节点上
return head;
}

ListNode nextHead = curr.next;
curr.next = null;
ListNode newHead = reverse(head);
head.next = reverseKGroup(nextHead, k);
return newHead;
}

private ListNode reverse(ListNode head) {
ListNode pre = null, curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}

return pre;
}
}
Iterate
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
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// d 1 2 3 4 5, when k == 3

ListNode dummyHead = new ListNode(-1, head);
ListNode pre = dummyHead;

while (pre.next != null) {
ListNode currHead = pre.next;
ListNode curr = currHead;
for (int i = 0; i < k - 1 && curr != null; i++) {
curr = curr.next;
}
if (curr == null) {
// 不足 k 个,直接返回
break;
}

ListNode nextHead = curr.next;
curr.next = null;

ListNode reversedHead = reverse(currHead);
// d 3 2 1 4 5
// r ch

pre.next = reversedHead;
currHead.next = nextHead;

pre = currHead;
}

return dummyHead.next;
}

private ListNode reverse(ListNode head) {
ListNode pre = null, curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}

return pre;
}
}
Reference

25. Reverse Nodes in k-Group