【问题标题】:Check Palindrome Linked List检查回文链表
【发布时间】:2021-03-15 19:35:48
【问题描述】:

我打算反转原始的 LinkedList 并将其与反转的 LinkedList 进行比较。如果相同,则返回 true。但是,我一直得到错误的结果。我哪里做错了?


var isPalindrome = function(head) {
    if(head == null || head.next == null) return true;
    
    let reversedHead = reverse(head)
    let count = 0
    while (head != null && reversedHead != null) {
        if(head.val != reversedHead.val) {
            return false
        }
        head = head.next
        reversedHead = reversedHead.next
    }
    if (head == null && reversedHead == null){
        return true
    } else {
        return false
    }
  
};
var reverse =(head)=> {
    let prev = null
    let next = new ListNode()
    let curr = new ListNode()
    curr = head
    while(curr){
        next = curr.next
        curr.next = prev
        prev = curr
        curr = next
    }
    return prev
}

【问题讨论】:

  • 你应该在你的 while 循环的反向部分中创建新节点,而不是之前两次。反向列表中的每个节点都需要是一个新节点。你需要复制vals。如果您的 `reverse 计划是返回一个新的反向列表而不是修改原始列表,那么至少您应该这样做。

标签: javascript algorithm linked-list palindrome


【解决方案1】:

打电话后:

let reversedHead = reverse(head)

您将反转列表,即头部已变为尾部,并且尾部的下一个引用为空。因此,您的循环将很快结束,如下所示:

head = head.next

...head 将是 null

您需要重新考虑算法。有几种方法可以做到...

你可以让reverse返回一个完全新的链表,而不是一个inplace反转:

function reverse(head) { // Does not modify the given list. Returns a new one.
    let node = head;
    let reversedHead = null;
    while (node) {
        reversedHead = new ListNode(node.val, reversedHead);
        node = node.next;
    }
    return reversedHead;
}

我在这里假设ListNode 构造函数接受第二个参数:

class ListNode {
    constructor(val, next=null) {
        this.val = val;
        this.next = next;
    }
}

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多