从链表中删除特定节点 - python

Deleting a specific node from a linked list - python

作为练习,我正在尝试创建自己的链表。我创建了一个节点 class 和一个链表 class。我已经能够创建一个构造函数和一个节点加法器方法。不过,我的删除方法有很多问题。首先是我的代码:

class Node:

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

def getNext(self):
    return self.next

def getValue(self):
    return self.value

class LinkedList:

def __init__(self,node):
    self.node = node

def __str__(self):
    node = self.node
    s = "[Node " + str(node.getValue())
    if node.getNext() is None:
        return s + "]"
    while node.next is not None:
        s += ", Node " + str(node.next.value)
        node = node.next
    return s + "]"

def add(self,newNode):
    node = self.node
    while node.next is not None:
        node = node.next
    node.next = newNode

def delete(self,value):
    head = self.node
    if head.getValue() == value:
        return LinkedList(head.next)
    temp = head
    while temp.next is not None:
        if temp.next.getValue() == value:
            temp = temp.next.next
            temp.next = None
            return LinkedList(head)
        temp = temp.next
    return "Sorry node is not here!"

我的删除函数给它一个特定的值,列表中的节点可能有也可能没有,然后删除节点和 return 列表,除非该节点不存在然后它将 return 一条消息。我有这样的情况,你只是通过 returning 一个构造函数来移除头部,尽管老实说我不是创建链表的新实例的忠实粉丝。从其他任何地方删除一个节点都行不通,因为我通过打印列表来测试它并且它显示链接列表没有变化。任何帮助将不胜感激!

这应该有效,而不是:

temp = temp.next.next

做:

temp.next = temp.next.next
return self

不知道您是否需要一般反馈,但这里有一些想法和我的实现。

我认为如果用户不需要使用 Node class,它的可用性会更容易。所以 constructor/add/delete 可以直接接受这个值。无论如何,我认为将节点 class 嵌套在 LinkedList 中以为其提供上下文更好。

你说你想避免创建 LinkedList 的新实例,所以我编写了它而不需要它。

删除函数仅删除第一次出现的值(注意可以有多个具有相同值的节点)

您的删除功能 return 是一条消息,这有点不寻常。我认为如果你想要一条错误消息或者如果这是唯一的预期错误可能只是 return True 或 False.

,最好将其放入异常中

我还没有写过迭代器,显然需要。

class LinkedList :

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

        def getValue(self) :
            return self.__value

    def __init__(self, value) :
        self.__node = self.Node(value)

    def __str__(self) :
        if self.__node is None :
            return '[empty]'

        node = self.__node
        s = "[Node " + str(node.getValue())
        if node.next is None:
            return s + "]"
        while node.next is not None:
            s += ", Node " + str(node.next.getValue())
            node = node.next
        return s + "]"

    def add(self, value):
        if self.__node is None :
            self.__node = self.Node(value)
            return

        node = self.__node
        while node.next is not None :
            node = node.next
        node.next = self.Node(value)


    def delete(self, value) :
        if self.__node is None :
            return False # or maybe raise

        node = self.__node
        if node.getValue() == value :
            if node.next is not None :
                self.__node = node.next
            else :
                self.__node = None
            return True

        while node.next is not None :
            if node.next.getValue() == value :
                newNext = node.next.next
                if newNext is not None :
                    node.next = newNext
                else :
                    node.next = None
                return True
        return False # or maybe raise