public static ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode current = dummy;
while (current != null && current.next != null) {
ListNode mostleft = current.next;
ListNode mostright = mostleft;
// 获取最右端节点
int i;
for (i = k - 1; i > 0; i--) {
if (mostright.next == null) {
break;
}
mostright = mostright.next;
}
// 剩下的节点不够反转
if (i > 0)
break;
ListNode next = mostright.next;
// mostleft到mostright的反转
ListNode innerPre = null;
ListNode innerCur = mostleft;
while (innerCur != next) {
ListNode innerNext = innerCur.next;
innerCur.next = innerPre;
innerPre = innerCur;
innerCur = innerNext;
}
current.next = mostright;
mostleft.next = next;
current = mostleft;
}
return dummy.next;
}