簡體   English   中英

如何刪除鏈表中的節點?

[英]How do I remove node in Linked List?

我正在使用Python實現鏈表。 這是我的代碼

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

class LinkedList:
    def __init__(self, head = None):
        self.head = head

    def append(self, newElement):
        current = self.head
        if self.head:
            while current.next:
                current = current.next
            current.next = newElement
        else:
            self.head = newElement
    #get position time complexity O(n)
    #get the node at a specific position
    def get_position(self, position):
        current = self.head
        current_pos = 1
        while current_pos <= position:
            if current_pos == position:
                return current
            current = current.next
            current_pos += 1
        return None
    #Insert element
    # Time complexity O(n)
    def insert_element(self, element, position):
        if position > 1:
            front_pos = self.get_position(position - 1)
            end_pos = self.get_position(position + 1)
            front_pos.next = element
            element.next = end_pos
        else:
            element.next = self.head
            self.head = element
    def delete_element(self, element):
        current = self.head
        previous = None
        while current:
            if current.value == element:
                if not previous:
                    self.head = element
                previous.next = current.next

            else:
                current = current.next
                previous = current

        else:
            return False


node1 = Node("Iron Man")
node2 = Node("Capitain America")
node3 = Node("Doctor Strange")
node4 = Node("Spider man")
node5 = Node("Rieder")
print("Node1 Value is {}".format(node1.value))
print("Node1 next Value is {}".format(node1.next))
print("Node2 Value is {}".format(node2.value))
print("Node2 next Value is {}".format(node2.next))
Avengers = LinkedList()
Avengers.append(node1)
print("Firt element in link list is {}".format(Avengers.head.value))
Avengers.append(node2)
print("After Iron Man is {}".format(Avengers.head.next.value))
print(Avengers.get_position(2).value)
Avengers.append(node3)
Avengers.append(node4)
Avengers.insert_element(node5, 4)
print(Avengers.get_position(4).value)
Avengers.delete_element(node5)
print(Avengers.get_position(4).value)

這是我的輸出:

Node1 Value is Iron Man
Node1 next Value is None
Node2 Value is Capitain America
Node2 next Value is None
Firt element in link list is Iron Man
After Iron Man is Capitain America
Capitain America
Rieder
Rieder

列表結構鏈接如下:Ironman-> Capitain America-> Strange Doctor-> Rieder-> Spiderman

因此,如果我不想使用“ Rieder”節點。 輸出的最后一行應顯示“ Spider man”

我的代碼中發生了什么? 非常感謝幫助我的人:D

一個問題是您似乎要更新current ,然后用current的新值更新previous的。 我將回到您的delete方法,並逐行進行檢查。 如果您在紙上寫出列表的每一行的狀態,並查看是否可以更正該算法,則將很有幫助。

else:
    current = current.next
    previous = current

首先,您需要修復您的insert_element函數。 您未正確插入節點。 這是正確的方法

def insert_element(self, element, position):
        if position > 1:
            front_pos = self.get_position(position - 1)
            # end_pos should not be position + 1, because it will
            # skip the element at index=position
            end_pos = self.get_position(position)
            front_pos.next = element
            element.next = end_pos
        else:
            element.next = self.head
            self.head = element

接下來,在刪除元素時,只需要傳遞節點的值,而不傳遞節點本身。 我對您的代碼做了一些小的更改,以修復一些錯誤。 查看評論以獲取更多信息

def delete_element(self, element):
        current = self.head
        previous = None
        while current:
            if current.value == element:
                # This means that the head itself
                # has to be deleted
                if not previous:
                    self.head = self.head.next
                # Add an else block correctly here
                # in case head is not to be deleted
                else:
                    previous.next = current.next
                # break the loop when the element is deleted
                break

            else:
                # First copy the current into previous,
                # Then change the value of current
                previous = current
                current = current.next

同樣也不需要else: return False在delete函數的末尾else: return False塊。

暫無
暫無

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

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