[英]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())
在remove_node
function 內部:
elif (next_node == None) and (current_node.value == remove_value):
current_node = None
在這部分 - 您沒有更改列表本身,您更改了變量current_node
並將None
放入其中。 您真正想要做的是將前一個節點的next_node
屬性更改為None
。
有兩種主要方法可以做到這一點:
當您在 function 中迭代時,您可以保存第二個變量,previous_node。 當你想刪除一個節點時,你改變previous_node(節點)next_node(屬性)跳過一個。 如果是最后一個,你把他的 next_node 改成 none。
使它成為一個雙連接列表,其中每個節點也包含他的前一個節點。 以這種方式迭代更容易。 本質上它是相同的邏輯,您必須將 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
您的代碼(編輯后的版本)幾乎沒有更改:
prev_node 聲明應該在 if 語句之外,因為你想在某些情況下使用它的值
從第一條語句中刪除了current_node = next_node.get_next_node()
行。 您當前的邏輯是:向前看一個節點,如果需要將其刪除並推進當前節點。 但是當你在一行中有 2 個值(例如 13 個)時會發生什么? 你取出第一個然后推進節點,所以你目前在第二個。 您無法刪除它,因為您總是提前刪除一個節點。 這里的問題不是“最后一個元素”,而是“連續 2 個元素”。 在我刪除這一行之后:從列表中刪除一個節點后,它只是在當前節點上再次進行迭代。 這就是為什么它會繼續刪除下一個節點並僅在“安全”推進時推進它。
現在 output 符合預期
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.