输入一个链表,反转链表后,输出新链表的表头。
思路一:
把全部链表内容都输入到一个数组,再次遍历链表,获得数组反转后的值,最后输出原来的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; }