Python链表无法保存头节点

时间:2019-04-13 00:36:09

标签: python linked-list

这是关于一个leetcode问题:“ 234。回文链接列表”

我想反向链接列表,并将反向列表与原始列表进行比较。如果没有差异,则返回True。

但是奇怪的是,尽管我将head复制到一个虚拟节点,但记录了起始位置。反转列表后,我无法从虚拟节点进行迭代,似乎列表中仅剩1个元素。

为什么/如何更新虚拟节点?这让我很烦,以至于我想撞墙。

感谢您的帮助!

谢谢!

我已经根据自己的有限知识尝试了一切。

bar

我希望上面的代码能正常工作

1 个答案:

答案 0 :(得分:0)

从您的代码中,我认为您的想法是反向链接列表,并与原始列表进行比较,但是这样做是不正确的。由于您更改了原始链接列表,因此无法再进行比较,因此必须进行复制,但这是一种低效的解决方案。

我已经根据您的代码编辑了copy version,它可以工作,但这并不是最好的方法。

def isPalindrome(self, head):
    dummy = head
    prev = None
    cur = origin = ListNode(0)

    # copy the original linkedlist
    while head:
        cur.next = ListNode(head.val)
        head = head.next
        cur = cur.next

    head = dummy
    while head:
        temp = head
        head = head.next
        temp.next = prev
        prev = temp

    cur = origin.next
    while prev and cur:
        print(prev.val, cur.val)

        if prev.val != cur.val:
            return False

        prev = prev.next
        cur = cur.next

    return True

一个更好的主意是将LinkList的上半部分反转,并比较上半部分是否等于下半部分:

def isPalindrome(self, head):
    if not head or not head.next:
        return True
    count, cur = 0, head
    while cur:
        cur = cur.next
        count += 1

    pre, cur, post = None, head, head.next
    for _ in range(count // 2):
        cur.next = pre
        pre, cur, post = cur, post, post.next
    head.next = cur

    slow = pre
    fast = cur.next if count % 2 else cur

    for _ in range(count // 2):
        if slow.val != fast.val:
            return False
        slow, fast = slow.next, fast.next

    return True

更优雅的版本,但不那么容易理解:

def isPalindrome(self, head):
    check = None
    slow = fast = head
    # traverse and reverse
    while fast and fast.next:
        fast = fast.next.next
        check, check.next, slow = slow, check, slow.next

    if fast:
        slow = slow.next
    while slow and slow.val == check.val:
        slow = slow.next
        check = check.next
    return not check

希望对您有所帮助,如果还有其他问题,请发表评论。 :)