public class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head==nullhead.next==nullk<2) return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode tail = dummy, prev = dummy,temp;
int count;
while(true){
count =k;
while(count>0&&tail!=null){
count;
tail=tail.next;
}
if (tail==null) break;//Has reached the end
head=prev.next;//for next cycle
// prev>temp>...>....>tail>....
// Delete @temp and insert to the next position of @tail
// prev>...>...>tail>head>...
// Assign @temp to the next node of @prev
// prev>temp>...>tail>...>...
// Keep doing until @tail is the next node of @prev
while(prev.next!=tail){
temp=prev.next;//Assign
prev.next=temp.next;//Delete
temp.next=tail.next;
tail.next=temp;//Insert
}
tail=head;
prev=head;
}
return dummy.next;
}
}
Share my Java Solution with comments in line


@zilchistdeepblue no because after the adjustment the original pre.next will be at the position of the original tail, which will grantee the program to enter the next cycle.

@zilchistdeepblue It's right because current prev.next will be the head of the next cyle

Count the length of Link List, for every sublist length as k, do reverse.
public ListNode reverseKGroup(ListNode head, int k) { int n = 0; ListNode cur = head; while(cur != null){ cur = cur.next; n++; } ListNode dmy = new ListNode(0); dmy.next = head; ListNode s = dmy, e = dmy.next; //s: start, e: end for(int i = n; i >= k; i = k){ for(int j = 1; j < k; j++){ // reverse group ListNode next = e.next; e.next = next.next; next.next = s.next; s.next = next; } s = e; e = s.next; } return dmy.next; }