You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:23:09