1public ListNode reverseKGroup(ListNode head, int k) {
2 if (head == null || k == 1) return head;
3
4 ListNode dummy = new ListNode(0);
5 dummy.next = head;
6
7 // Count total nodes
8 ListNode curr = dummy;
9 int count = 0;
10 while (curr.next != null) {
11 curr = curr.next;
12 count++;
13 }
14
15 ListNode prev = dummy;
16
17 // Reverse every k-group
18 while (count >= k) {
19 curr = prev.next;
20 ListNode next = curr.next;
21
22 // Reverse k-1 times
23 for (int i = 1; i < k; i++) {
24 curr.next = next.next;
25 next.next = prev.next;
26 prev.next = next;
27 next = curr.next;
28 }
29
30 prev = curr;
31 count -= k;
32 }
33
34 return dummy.next;
35}