chenssir 2023-01-09 19:05 采纳率: 100%
浏览 25
已结题

尝试实现双向链表remove方法时遇到的问题

问题遇到的现象和发生背景

刚刚开始学习python,在尝试实现双向链表中,移除第一个值为data的节点这个方法时,当删除的节点为第一个节点,遇到了一些问题

遇到的现象和发生背景,请写出第一个错误信息

当删除第一个节点时,我需要先将头节点self.head指向第二个节点,但是否需要使第二个节点的prev指针指向None吗?因为我发现若不把第二个节点的prev指针指向None,代码还是正常运行的,不管是双向链表内的元素个数还是别的功能都是正常的,但我发现第二个节点的prev仍然指向了删除掉的第一个节点,这样是不是代表第一个节点没有被真正的删除,其数据还是保存在计算机里的呢

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

remove功能代码如下

    def remove(self, data):
        cur = self.head
        while cur:
            if cur.data == data:
                # 判断是否为头节点
                if cur == self.head:
                    self.head = cur.next
                    # cur.next.prev = None
                    print(cur.next.prev.data)  # 我添加了这一行代码发现第二节点的prev仍然指向删除的节点
                else:
                    cur.prev.next = cur.next
                    # 判断是否为尾节点
                    if cur.next:
                        cur.next.prev = cur.prev  # 如果不是尾节点,才能执行这句
                self.length -= 1
                return 0
            cur = cur.next
        return -1

我的解答思路和尝试过的方法:

我想的是在判断是否为头节点时,再添加一个判断,即是否链表中只有一个节点,因为此时cur.next是None,如果使用cur.next.prev = None会报错,请问这样可以吗

  • 写回答

1条回答 默认 最新

  • 谛凌 2023-01-11 21:22
    关注

    这样写肯定是会输出被“删除”的结点
    因为你所谓的“删除”是你的在逻辑上把它删了,并没有回收它的内存
    而如果你让next的prev指向None,也肯定是报错,因为None没有data

                    if cur == self.head:
                        self.head = cur.next
                        # cur.next.prev = None
                        print(cur.next.prev.data)
    

    此处代码并未将cur的next的pre修改,所以2依然指向被“删除”的1

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月15日
  • 已采纳回答 2月7日
  • 创建了问题 1月9日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示