Reverse linked list in k-Group

這題用到所有 linked list 該考的東西

這種題目把圖畫出來較容易理解,

我們可以這樣做:

一個輔助函數,每次返回反轉 K個後的最後一個,這樣下一次就又可以反轉

不足 K個就回傳空,

但這樣第一個要怎辦? 我們就用 dummy node表示

public ListNode reverseKGroup(ListNode head, int k) {
    // write your code here
    if (head == null) {
        return head;
    }

    ListNode dummy = new ListNode(0);
    dummy.next = head;
    head = dummy;
    while (head != null) {
        head = reverseNextK(head, k);
    }
    return dummy.next;
}

//head -> n1 -> n2 -> ... nk -> nk+1
//=>
//head -> nk -> nk-1 -> .. n1 -> nk+1
//return n1
//return the next of reverse K
public ListNode reverseNextK(ListNode head, int k) {
    ListNode n1 = head.next;
    ListNode nk = head;
    for (int i = 0; i < k; i++) {
        nk = nk.next;
        if (nk == null) {
            return null;
        }
    }

    //reverse
    ListNode nk_plus = nk.next;
    ListNode prev = null;
    ListNode cur = n1;
    while (cur != nk_plus) {
        ListNode tmp = cur.next;
        cur.next = prev;
        prev = cur;
        cur = tmp;
    }

    //connect
    head.next = nk;
    n1.next = nk_plus;
    return n1;
}

results matching ""

    No results matching ""