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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。