检查链接列表是否为回文。找不到问题

时间:2018-08-03 07:25:37

标签: python linked-list

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

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

考虑将slow作为指向列表中节点的指针。将其设置为None不会更改它之前指向的节点,它只是将slow设置为指向另一个节点,或者指向您的情况下的一个None节点。因此,它不再指向0,而是由0指向,head仍然存在并且仍在其位置。

因此head.next仍指向下一个节点0,因此列表的前半部分为1->0->None