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;
}

布谷
1 声望0 粉丝