Turtle蛇形链项目中多次按Del键仅能删除最后一个跟随者的问题排查请求
Turtle蛇形链项目中多次按Del键仅能删除最后一个跟随者的问题排查请求
嘿,我仔细看了你的代码,发现了两个关键问题导致你按Del键只能删除一次跟随者,咱们一步步来解决:
问题1:添加跟随者时Prev指针赋值顺序错误
在add_follower方法的else分支里,你先把self.Last更新为新的跟随者,再给new_follower.Prev赋值,这会导致新跟随者的Prev指向它自己,直接打乱了整个链表的结构:
# 原错误代码 else: self.Last.Next = new_follower self.Last = new_follower new_follower.Prev = self.Last # 这里self.Last已经是new_follower了,等于让它指向自己
修正后的代码:
else: old_last = self.Last # 先保存当前最后一个节点 old_last.Next = new_follower new_follower.Prev = old_last # 让新节点的Prev指向真正的前一个节点 self.Last = new_follower # 最后更新Last为新节点
问题2:删除跟随者的方法缺少边界判断且逻辑有漏洞
原remove_last_follower方法里,当self.Last为空时(比如已经删完所有跟随者),直接访问last_follower会引发错误;另外,当删除第一个跟随者时,逻辑处理也有问题:
# 原错误代码 def remove_last_follower(self, event): if self.Last: last_follower = self.Last if last_follower.Prev: # 如果self.Last为空,这里会报错 self.Last = last_follower.Prev self.Last.Next = None else: self.Last = None self.Next = None last_follower.hideturtle() self.deleted_followers.append(last_follower)
修正后的代码:
def remove_last_follower(self, event): # 如果没有可删除的跟随者,直接返回 if not self.Last: return last_follower = self.Last prev_node = last_follower.Prev # 分情况处理前一个节点 if prev_node == self: # 这是第一个跟随者,删除后清空Last和Next self.Last = None self.Next = None elif prev_node: # 不是第一个跟随者,更新Last为前一个节点,并清空它的Next self.Last = prev_node self.Last.Next = None # 隐藏并回收该跟随者 last_follower.hideturtle() self.deleted_followers.append(last_follower)
测试验证
把这两处修改后,你再按Del键就能每次删除最后一个跟随者了,而且删除完所有跟随者后再按Del键也不会报错。另外,你添加跟随者的逻辑(复用已删除的节点)是没问题的,修改后也能正常工作。
备注:内容来源于stack exchange,提问作者Number_Pi
相关产品推荐
相关产品推荐

