错误使用Python实现链表的删除功能

时间:2015-02-03 23:16:54

标签: python linked-list

您好我正在尝试通过执行第一个赋值来学习Python,即使用Python实现链接列表。我已经实现了所有其他功能。但是删除函数在尝试删除不存在的项时给出了错误。谁能帮我?非常感谢。

我定义的删除功能:

def delete(self,item):

        current = self.head
        previous = None
        found = False

        while not found:
            if current.get_data() == item:
                found = True
            else:
                previous = current
                current = current.get_next()

        if previous == None:
            self.head = current.get_next()
        else:
            previous.set_next(current.get_next())

然后我编写了以下代码进行测试:

my_list = LinkedList()
my_list.add(31)
my_list.add(77)
my_list.add(17)
my_list.add(93)
my_list.add(26)
my_list.add(54)

assert my_list.size() == 6
my_list.delete(77)
my_list.delete(1)
assert my_list.size() == 5
print(my_list.__str__())

AttributeError:'NoneType'对象没有属性'get_data'

get_data()在Node类中定义,我不知道为什么当尝试删除不存在的项时,当前局部变量变为NoneType而不是Node。谁能帮我?谢谢!

2 个答案:

答案 0 :(得分:2)

您的循环仅在您实际找到该元素时停止。如果元素不在列表中,那么它就会继续。据推测,get_next()会为最后一个元素返回None,因此在循环遍历列表current中的所有元素后,变为None。下次循环播放时,您调用current.get_data(),即无效,因为currentNoneNone没有get_data成员,就像错误信息所说的那样。

要解决此问题,您需要在到达数组末尾时停止循环。您可以通过将while修改为

来完成此操作
while current is not None and not found:

答案 1 :(得分:0)

当您进入循环时,在尝试访问其数据之前,您需要确保current不是None。我能想到的最简单的方法是简单地返回None

while not found:
    if current is None:
        return
    # rest of loop