YSMull
<-- algorithm



原题链接

这道题和第24题一样,最好引入一个 sentry 结点,因为链表的 head 结点会被修改掉。

维护 prev 和 head,每次用 prev.next 更新 head,如果 head 为空说明转换结束。

如果元素不足 k 个了,就让 prev 指向最后一个结点。

简单画个草图:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode sentry = new ListNode(0);
        sentry.next = head;
        ListNode prev = sentry;
        while (head != null) {
            prev = reverseK(prev, head, k);
            head = prev.next;
        }
        return sentry.next;
    }

    public ListNode reverseK(ListNode prev, ListNode head, int k) {
        { // 检查剩下的链表还有没有 k 个元素
            int m = 1;
            ListNode p = head; // head 保证了一定不是 null
            while (p.next != null && m < k) {
                p = p.next;
                m += 1;
            }
            if (m < k) return p;
        }
        prev.next = reverseK(head, k);
        return head;
    }

    private ListNode reverseK(ListNode head, int k) {
        ListNode left = null;
        ListNode right = head;
        int n = 0;
        while (n < k) {
            ListNode next = right.next;
            right.next = left;
            left = right;
            right = next;
            n += 1;
        }
        head.next = right;
        return left;
    }
}