检查链表是否是回文

时间:2017-09-10 22:34:30

标签: javascript linked-list pass-by-reference palindrome

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var isPalindrome = function(head) {
    if(head === null){
        return true;
    }
    var current, runner;
    current = head;
    runner = head;
    runner = reverseList(runner);
    while(current !== null && runner !== null){
        if(current.val != runner.val){
            return false;
        }
        else{
            current = current.next;
            runner = runner.next;
        }
    }
    return true;
};

这是我的反向功能。这是我认为我遇到的问题最多的地方。我遇到与this post类似的问题,但我并不完全确定如何修复对象引用问题。

var reverseList = function(head){
    var previous, current, next;
    current = head;
    previous = null;
    next = null;
    while(current !== null){
        next = current.next;
        current.next = previous;
        previous = current;
        current = next;
    }
    head = previous;
    return previous;
}

给[1,3,4,5,1]的输入返回true,所以我认为运行reverse函数只返回链表中的单个节点。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你的设置中有两个错误我会指向你...如果你想要解决它们如何修复它们,我可以给你那些,但因为这看起来像一个学习问题我'我只是指出你正确的方向。

第一个错误确实在你的reverseList函数中,但不是因为它只返回一个节点。问题是您通过引用传递原始列表,然后对其进行操作,因此在reverseList /结尾处包含[1,5,4,3,1]时,{{1} }不再包含[1,3,4,5,1]。您需要查看如何在不破坏初始列表的情况下生成反向列表...

其次,runner 中的反转后的逻辑假定两个列表的长度相同,但如果一个列表只是另一个列表的前缀,则返回true(例如,如果head恰好在您的操作之后[1]并且isPalindrome包含[1,5,4,3,1])