从链表中删除节点

问题描述 投票:0回答:1

我创建了一个带有删除方法的链表类。我已经编写了无论什么情况都删除节点的代码,就像

  1. 如果删除节点是self.head
  2. 如果链表中只有一个节点
  3. 链表中的任意节点

代码:

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

class LinkedList:
    def __init__(self):
        self.head = None
        self.tail = None
        self.length = 0
    
    def __str__(self):
        temp_node = self.head
        result = ''
        while temp_node is not None:
            result += str(temp_node.value)
            if temp_node.next is not None:
                result += ' -> '
            temp_node = temp_node.next
        return result
    
    def append(self, value):
        new_node = Node(value)
        if self.head is None:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            self.tail = new_node
        self.length += 1
        
    def get(self, index):
        temp_node = self.head
        if self.length == 1 or index == 0:
            return self.head
        else:
            for _ in range(index):
                temp_node = temp_node.next
            return temp_node
            
    def remove(self,index):
        if (index == 0):
            popped_node = self.head
            self.head = self.head.next
            return popped_node
        elif (self.length == 1):
            popped_node = self.head
            self.head = self.tail = None
            return popped_node
        else:
            temp_head = self.head
            for _ in range(index-1):
                temp_head = temp_head.next
            prev_node = temp_head
            popped_node = prev_node.next
            prev_node.next = popped_node.next
            popped_node.next = None
            return popped_node

但最终它给出以下错误

错误详情 5 != 4 : 删除头节点失败

这里有什么问题?

python singly-linked-list
1个回答
0
投票

remove
中,您不会更新
length
属性,并且除了一种情况之外,您也不会更新
self.tail
(当删除最后一个节点时)。

没问题,但你不需要区分中间情况和

else
情况。

更正:

    def remove(self,index):
        if not (0 <= index < self.length):
            return  # Index out of range: ignore
        if index == 0:
            popped_node = self.head
            self.head = self.head.next
            if not self.head:
                self.tail = None  ## This was missing
        else:
            temp_head = self.head
            for _ in range(index-1):
                prev_node = prev_node.next
            prev_node = temp_head
            popped_node = prev_node.next
            prev_node.next = popped_node.next
            if not prev_node.next:
                self.tail = prev_node  ## This was missing

        # Some code is common to both cases:
        popped_node.next = None
        self.length -= 1  ## This was missing
        return popped_node
© www.soinside.com 2019 - 2024. All rights reserved.