class Solution(object):
def isPalindrome(self, head):
"""
:type head: ListNode
:rtype: bool
"""
if head == None:
return True
if head.next == None:
return True
slow = head
fast = head
if fast.next.next == None:
return fast.val == fast.next.val
length = 1
lenPtr = head
while lenPtr.next != None:
length += 1
lenPtr = lenPtr.next
while fast != None and fast.next != None:
slow = slow.next
fast = fast.next.next
if length % 2 == 0: # even
rev = self.reverse(slow)
else:
rev = self.reverse(slow.next)
slow = None
print(rev.val, head.val, head.next.val)
return rev == head
def reverse(self, head):
if head.next == None:
print('return head', head.val)
return head
tempHead = head
while head.next != None:
temp = head.next
head.next = head.next.next
temp.next = tempHead
tempHead = temp
return tempHead
这是我针对编码面试问题的解决方案,该问题用于查找链表是否是回文。
我的策略只是通过使用两个速度不同的指针找到链表的中点,然后反转链表的后半部分,然后与前半部分进行比较。
在调试之后,问题在于,链表的前半部分是奇数长度的列表时,不会删除最后一个节点。例如,如果输入为1->0->1->None
,那么下半部将最终为1->None
,而上半部也应为1->None
,因为我在倒数第二次输入后做了slow = None
一半。
但是,即使设置了0
,它似乎仍然具有slow = None
节点。这很奇怪,因为在我尝试调试时head.next == slow
返回了true
。
可能是什么问题?
答案 0 :(得分:1)
考虑将slow
作为指向列表中节点的指针。将其设置为None
不会更改它之前指向的节点,它只是将slow
设置为指向另一个节点,或者指向您的情况下的一个None
节点。因此,它不再指向0
,而是由0
指向,head
仍然存在并且仍在其位置。
因此head.next
仍指向下一个节点0
,因此列表的前半部分为1->0->None
。