每日一道算法題

2018.10.14

來源:劍指offer

題目:反轉鏈表

輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
思路一:
把全部鏈表內容都輸入到一個數組,再次遍歷鏈表,獲得數組反轉後的值,最後輸出原來的head,只是值變了。
遇到的坑:
剛拿到這道題就while(currentNode.next)直接作了這樣的判斷,但是萬一head是null,這個判斷就是錯誤的了。就致使了雖然本身測試的時候代碼是對的。可是牛客網的編輯器卻一直通不過。算法

/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function ReverseList(pHead)
{
    // write code here
    var arr = [];
    var currentNode = pHead;
    while(currentNode) {
        arr.push(currentNode.val);
        currentNode = currentNode.next;
    }
    currentNode = pHead;
    while(currentNode) {
        currentNode.val = arr.pop();
        currentNode = currentNode.next;
    }
    return pHead;
}

思路二:
上述算法遍歷了兩次鏈表,還額外申請了一個數組空間,效率不高,不如直接就地反轉鏈表,更改每一個節點自身的next指針。數組

function ReverseList(pHead)
{
    if(!pHead) return pHead;
    var prev = null;
    var next = null;
    while(true) {
        //保存上次
        next = pHead.next;
        pHead.next = prev;
        if(next === null) break;
        prev = pHead;
        pHead = next;
    }
    
    return pHead;
}
相關文章
相關標籤/搜索