簡體   English   中英

無法從鏈表中僅刪除最后一個元素! (具有特定值的所有其他元素都被刪除)

[英]Not able to remove just the last element from the linked list! (All other elements with the particular value are removed)

我正在嘗試從具有特定值的鏈表中刪除節點,對於給定的輸入,我要刪除除最后一個之外的所有節點。 我還添加了“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())

最后 13 個仍未刪除,請提出更改建議,以便我也可以將其刪除

remove_node function 內部:

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

在這部分 - 您沒有更改列表本身,您更改了變量current_node並將None放入其中。 您真正想要做的是將前一個節點的next_node屬性更改為None

有兩種主要方法可以做到這一點:

  1. 當您在 function 中迭代時,您可以保存第二個變量,previous_node。 當你想刪除一個節點時,你改變previous_node(節點)next_node(屬性)跳過一個。 如果是最后一個,你把他的 next_node 改成 none。

  2. 使它成為一個雙連接列表,其中每個節點也包含他的前一個節點。 以這種方式迭代更容易。 本質上它是相同的邏輯,您必須將 go 到上一個節點並將他的下一個節點更改為無。 然后更容易保持第二個變量。

編輯:在您編輯代碼並實現 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 個)時會發生什么? 你取出第一個然后推進節點,所以你目前在第二個。 您無法刪除它,因為您總是提前刪除一個節點。 這里的問題不是“最后一個元素”,而是“連續 2 個元素”。 在我刪除這一行之后:從列表中刪除一個節點后,它只是在當前節點上再次進行迭代。 這就是為什么它會繼續刪除下一個節點並僅在“安全”推進時推進它。

現在 output 符合預期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM