python-3.x 我在linkedDeque中的remove rear函数不起作用

xggvc2p6  于 2023-03-04  发布在  Python
关注(0)|答案(1)|浏览(141)

嗨,我的remove_rear()没有返回正确的值,我的想法是循环查找指向rear的节点,并将其设置为新的self._rear。

def remove_rear(self):
        if self._length<2:
            return None
        elif self._length==1:
            self._rear=temp
        else:
            temp=self._front
            temp2=self._front.get_next()

            while temp2!=None:
                temp=temp.get_next()
                temp2=temp2.get_next()

            self._rear=temp
            temp.set_next(None)
            self._length-=1
            return (temp.get_data())

在我的驱动程序中,当我删除rear,然后调用get_rear()时,节点仍然存在。

atmip9wb

atmip9wb1#

其中一些问题:

  • 列表中只有一个元素,第一个if条件为真,列表中没有任何变化,但是需要删除一个节点...
  • 第二个if条件的条件永远不会为真,因为第一个if块已经选择了这种情况(当长度为1时),函数在这里退出。此外,第二个if块引用temp,而它还没有被定义。
  • else部分中,temptemp2晚一步,当temp2None时,循环退出,因此,当循环退出时,temp2将是后面的节点,这意味着这个循环没有任何意义,因为您已经知道后面的节点是什么:self._rear=temp不会有任何影响,因为这两个值已经相等。循环应该少一次迭代。
  • self._length-=1仅在else块中执行,但也应该在列表只有一个节点时执行。

以下是对您的代码的更正:

def remove_rear(self):
        if not self._front:
            return None
        # read the value that we will return
        value = self._rear.get_data()
        if self._front == self._rear:
            self._front = self._read = None
        else:
            temp = self._front
            while temp.get_next() != self._rear:  # Compare with rear
                temp = temp.get_next()
            temp.set_next(None)
            self._rear = temp
        # Always reduce length
        self._length -= 1
        return value

相关问题