Проверка, является ли связанный список палиндромом. Не могу найти проблему

1
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 когда я пытаюсь его отладить.

Что может быть проблемой?

Теги:
linked-list

1 ответ

1

Подумайте о slow как указатель на узел в списке. Установка его на None не изменяет указатель, на который он указывал ранее, он просто устанавливает slow указание на другой узел или на узел None в вашем случае. Поэтому он больше не указывает на 0, но 0 все еще существует и все еще на своем месте, заостренным head.

Поэтому head.next по-прежнему указывает на следующий узел, который равен 0 и поэтому первая половина вашего списка - 1->0->None.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню