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
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummyHead = new ListNode(-1, head);
ListNode pre = dummyHead;

while (pre.next != null) {
// p -> 1 -> 2 -> 3
ListNode subTail = pre;
for (int i = 0; i < k && subTail != null; i++) {
subTail = subTail.next;
}
if (subTail == null) {
break;
}

ListNode nextHead = subTail.next;
subTail.next = null; // 不要忘记切断链表

ListNode newSubHead = subTail;
ListNode newSubTail = pre.next;
reverse(pre.next);
pre.next = newSubHead;

newSubTail.next = nextHead;
pre = newSubTail;
}

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;
}
}

References

25. Reverse Nodes in k-Group