这是关于一个leetcode问题:“ 234。回文链接列表”
我想反向链接列表,并将反向列表与原始列表进行比较。如果没有差异,则返回True。
但是奇怪的是,尽管我将head复制到一个虚拟节点,但记录了起始位置。反转列表后,我无法从虚拟节点进行迭代,似乎列表中仅剩1个元素。
为什么/如何更新虚拟节点?这让我很烦,以至于我想撞墙。
感谢您的帮助!
谢谢!
我已经根据自己的有限知识尝试了一切。
bar
我希望上面的代码能正常工作
答案 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
希望对您有所帮助,如果还有其他问题,请发表评论。 :)