每日一道算法题

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;
}
相关文章
相关标签/搜索