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
когда я пытаюсь его отладить.
Что может быть проблемой?
Подумайте о slow
как указатель на узел в списке. Установка его на None
не изменяет указатель, на который он указывал ранее, он просто устанавливает slow
указание на другой узел или на узел None
в вашем случае. Поэтому он больше не указывает на 0
, но 0
все еще существует и все еще на своем месте, заостренным head
.
Поэтому head.next
по-прежнему указывает на следующий узел, который равен 0
и поэтому первая половина вашего списка - 1->0->None
.