LinkedList isPalindrome 检查总是返回 True

时间:2020-12-19 09:05:59

标签: python recursion data-structures linked-list

第一个 if 检查是为了确保左即起始节点和右即结束节点数据如果它们不匹配则返回 false,但控制流不会在函数外返回,而是保持与其他节点匹配并为其他节点运行 else 条件其他情况。

class Node:
    def __init__(self,data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None
        self.size = 0
        self.tail = None
        self.left = None        

    def palindromeHelper(self,right):
        if(right == None):
            return True

        rres = self.palindromeHelper(right.next)

        print(self.left.data, right.data)
        if self.left.data != right.data:
            return False
        else:
            self.left = self.left.next
            return True

    def isLinkedListPaliendrome(self):
        right = self.left = self.head
        print(self.palindromeHelper(right))

list4 = LinkedList()
list4.addLast('b')
list4.addLast('a')
list4.addLast('c')
list4.addLast('a')
list4.addLast('b')
list4.addLast('a')

list4.isLinkedListPaliendrome()


Output: 
b a
b b
a a
c c
a a
b b
True

1 个答案:

答案 0 :(得分:0)

您的总体策略是有道理的:

  1. 设置一个指向列表前面的指针。
  2. 递归地到达列表的末尾。
  3. 随着调用堆栈展开(基本上是在列表中向后移动),将您在第一步设置的指针向前移动,比较数据。

问题是您忽略了中间 False 结果。考虑这个输入:

abc

请注意,没有字母出现两次。让我们看看会发生什么:

  1. 左=a,右=a
  2. 左=a,右=b
  3. 左=a,右=c
  4. left=a,right=null,返回真
  5. 现在堆栈开始展开。左=a,右=c,返回假
  6. left=a,right=b,返回 False
  7. left=a, right=a,​​从左到左移动。next (left=b),返回True

因此,任何具有唯一起始字母的字符串都将返回 True。其实很多类型的字符串都会返回True,因为算法只考虑最后的比较,忽略中间的失败。

您需要做的是使用中间结果rres。如果任何步骤返回 False,则整个调用堆栈也需要返回 False。