无法仅从链接列表中删除最后一个元素! (所有其他具有特定值的元素都将被删除)

时间:2020-05-22 21:50:23

标签: python data-structures linked-list

我正在尝试从链表中删除具有特定值的节点,对于给定的输入,我将删除除最后一个节点以外的所有节点。我还添加了'elif'案例,尤其是删除了最后一个节点,但不知道为什么它不起作用。我对编程和数据结构是相当陌生的,无法指出错误。请帮忙:)

class Node:
  def __init__(self, value, next_node=None):
    self.value = value
    self.next_node = next_node

  def get_value(self):
    return self.value

  def get_next_node(self):
    return self.next_node

  def set_next_node(self, next_node):
    self.next_node = next_node

class LinkedList:
  def __init__(self, value=None):
    self.head_node = Node(value)

  def get_head_node(self):
    return self.head_node

  def new_beginning(self, new_value):
    new_node = Node(new_value)
    new_node.set_next_node(self.head_node)
    self.head_node = new_node

  def stringify_list(self):
    string_list = ""
    current_node = self.get_head_node()
    while current_node:
      if current_node.get_value() != None:
        string_list += str(current_node.get_value()) + "\n"
      current_node = current_node.get_next_node()
    return string_list

  def remove_node(self, value_to_remove):
    current_node = self.get_head_node()
    if current_node.get_value() == value_to_remove:
      self.head_node = current_node.get_next_node()
    else:
      while current_node:
        next_node = current_node.get_next_node()
        if next_node.get_value() == value_to_remove:
          current_node.set_next_node(next_node.get_next_node())
          current_node = None
        else:
          current_node = next_node

  def remove_all_nodes(self,remove_value):
    current_node = self.get_head_node()
    while current_node:
      if current_node ==self.get_head_node() and current_node.value== remove_value:
        self.head_node = current_node.get_next_node()
        current_node = self.get_head_node()
      else:
        next_node = current_node.get_next_node()
        if next_node!= None and next_node.value == remove_value:
          prev_node = current_node
          current_node.set_next_node(next_node.get_next_node())

          current_node = next_node.get_next_node()
        elif (next_node == None) and (current_node.value == remove_value):
          #current_node = None
          prev_node.set_next_node(None)
        else:
          prev_node = current_node
          current_node = next_node


link_list = LinkedList(13)
link_list.new_beginning(13)
link_list.new_beginning(14)
link_list.new_beginning(15)
link_list.new_beginning(100)
link_list.new_beginning(13)
link_list.new_beginning(133)
link_list.new_beginning(13)
link_list.new_beginning(199)
link_list.new_beginning(13)
link_list.new_beginning(13)

print(link_list.stringify_list())
#print(len(link_list))

link_list.remove_all_nodes(13)

print(link_list.stringify_list())

The last 13 is still not getting removed, please suggest changes so that i am able to remove that too

1 个答案:

答案 0 :(得分:0)

内部remove_node函数:

elif (next_node == None) and (current_node.value == remove_value):
          current_node = None

在这一部分中-您没有更改列表本身,而是更改了变量current_node并将None放入其中。您真正想要做的是将前一个节点的更改next_node属性设置为None

主要有两种方法:

  1. 当您在函数内部进行迭代时,可以保留第二个变量previous_node。当您要删除一个节点时,可以将previous_node(该节点)next_node(属性)更改为跳过一个。如果是最后一个,则将其next_node更改为none。

  2. 使其成为一个双重连接的列表,其中每个节点还保存着其先前的节点。以这种方式进行迭代更容易。本质上是相同的逻辑,您必须转到上一个节点并将其下一个节点更改为无。只需再持有一个变量就可以了。

编辑:编辑代码并实现previous_node之后,您的代码中仍然存在一个问题。这是固定代码:

    def remove_all_nodes(self,remove_value):
        current_node = self.get_head_node()
        while current_node:
            if current_node == self.get_head_node() and current_node.value == remove_value:
                self.head_node = current_node.get_next_node()
                current_node = self.get_head_node()
            else:
                next_node = current_node.get_next_node()
                prev_node = current_node
                if next_node != None and next_node.value == remove_value:
                    current_node.set_next_node(next_node.get_next_node())
                elif (next_node == None) and (current_node.value == remove_value):
                    prev_node.set_next_node(None)
                    current_node = None
                else:
                    current_node = next_node

您的代码(修改后的版本)几乎没有变化:

  1. prev_node声明应该在if语句之外,因为您希望在某些情况下使用它的值

  2. 从第一条语句中删除了行current_node = next_node.get_next_node()。您当前的逻辑是:向前看一个节点,如果需要将其删除,然后前进当前节点。但是当您在行中有2个值(例如13个)时会发生什么?您先取出节点,然后前进节点,所以您当前在第二节点上。您不能删除它,因为您总是删除前面的一个节点。这里的问题不是“最后一个元素”,而是“连续两个元素”。在删除此行之后:从列表中删除一个节点后,它仅在当前节点上再次进行迭代。这就是为什么它将继续删除下一个节点并仅在“安全”前进时继续前进。

现在输出达到预期