/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || k == 1) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy, end = head;
while(end != null) {
for(int i = 1; i < k && end != null; i++) {
end = end.next;
}
if(end == null) {
break;
}
prev = reverseK(prev, prev.next, end);
end = prev.next;
}
return dummy.next;
}
// Reverses prev + [start, end]
// Returns tail after reversion
private ListNode reverseK(ListNode prev, ListNode start, ListNode end) {
ListNode curr = start, next = curr.next;
ListNode endNext = end.next;
while(curr != end) {
start.next = next.next;
prev.next = next;
next.next = curr;
next = start.next;
curr = prev.next;
}
start.next = endNext;
return start;
}
}
Time: O(n)
Space: O(1)