您好我正在尝试通过执行第一个赋值来学习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。谁能帮我?谢谢!
答案 0 :(得分:2)
您的循环仅在您实际找到该元素时停止。如果元素不在列表中,那么它就会继续。据推测,get_next()
会为最后一个元素返回None
,因此在循环遍历列表current
中的所有元素后,变为None
。下次循环播放时,您调用current.get_data()
,即无效,因为current
为None
而None
没有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