輸入一個鏈表,反轉鏈表後,輸出新鏈表的表頭。
思路一:
把全部鏈表內容都輸入到一個數組,再次遍歷鏈表,獲得數組反轉後的值,最後輸出原來的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; }