【问题标题】:Check if a linked list is a palindrome检查链表是否为回文
【发布时间】:2017-09-10 22:34:29
【问题描述】:
/**
 * 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 函数只会返回链表中的单个节点。

感谢任何帮助。

【问题讨论】:

  • 我相信运行反向函数只会返回一个节点。您可以自己检查 reversList 是否错误,而不是相信事情。所以,你可以直接要求一个故障的尊敬列表,而不是询问整个算法的错误在哪里。
  • [1, 3, 4, 5, 1] 不是链表。您究竟如何调用该函数?你传递给函数的值是什么?

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


【解决方案1】:

您的设置中有两个错误,我会指出您...只会为您指明正确的方向。

第一个错误确实在您的 reverseList 函数中,但不是因为它只返回一个节点。问题是您通过引用传递原始列表,然后对其进行操作,因此在 reverseList runner 的末尾包含 [1, 5, 4, 3, 1] 正如您所期望的那样,head 不再包含[1、3、4、5、1]。您需要了解如何在不破坏初始列表的情况下生成反向列表...

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

【讨论】:

  • 这正是我所需要的。感谢您的帮助。
猜你喜欢
  • 2017-12-11
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2020-04-24
  • 2012-09-02
相关资源
最近更新 更多