# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
if head == self.reverse(head):
return True
return False
def reverse(self, head):
if not head or not head.next:
return head
cur = head
prev = None
while cur:
tmp = cur.next
cur.next = prev
prev = cur
cur = tmp
return prev
在测试用例[0,0]上,结果将是错误的,但对于其他情况,结果是正确的。这是leetcode234。
答案 0 :(得分:1)
您的解决方案的总体思路似乎是反转链接列表并进行比较,以查看它是否等于原始链接列表。
那么,一个问题是,尽管您解决方案的reverse
方法看起来像正确地反向了一个链表,但它却是破坏性的:因为它会更改所有节点指针,所以原始链表回来的时候消失了。返回后,您将获得一个反向链接列表,但是您将没有原始链接列表来将其与其他列表进行比较!解决此问题的一种方法可能是创建并返回一个新的链表,该链表是您传递给reverse
的链表的反转。
假设您已解决此问题,第二个问题是(除非LeetCode在幕后进行的工作比在这里提到的要多),==
在两个ListNode
之间不会做任何有用的事情,因为它只是调用类上的__eq__
方法,没有人定义。如果要检查两个链表是否相等,就意味着它们具有相同的值,并且顺序相同,则可能必须定义自己的方法或函数才能逐个节点地,逐个值地进行处理。
答案 1 :(得分:0)
不确定在您的代码中我们在哪里检查回文。
对于这个问题,我们可以简单地进行遍历并使用A == A[::-1]
返回以检查回文(在Python中):
class Solution:
def isPalindrome(self, head):
vals = []
while head:
vals.append(head.val)
head = head.next
return vals == vals[::-1]