資料結構之連結串列:206. 反轉連結串列

zpfnext發表於2020-09-30
反轉一個單連結串列。	

示例:

輸入: 1->2->3->4->5->NULL
輸出: 5->4->3->2->1->NULL

進階:

你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題?

方法一

var reverseList = function(head) {
    let p1 = head;
    let p2 = null;
    while(p1) {
        const tmp = p1.next;
        p1.next = p2;
        p2=p1;
        p1=tmp;
    }
    return p2;
};

精簡

var reverseList = function(head) {
    let [p2, p1] = [null, head];
    while (p1) {
        let tmp = p1.next;    // 1. 臨時儲存當前指標後續內容
        p1.next = p2;       // 2. 反轉連結串列
        p2 = p1;            // 3. 接收反轉結果
        p1 = tmp;             // 4. 接回臨時儲存的後續內容
    }
    return p2;
};

再精簡

var reverseList = function(head) {
    let [p2, p1] = [null, head];
    while (p1) {
        [p1.next, p2, p1] = [p2, p1, p1.next];
    }
    return p2;
};
時間: O(n). 逐個推進故 O(n).
空間: O(1). 只用到了常數級額外空間故 O(1).

相關文章