从链表中删除特定节点 - 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
作为练习,我正在尝试创建自己的链表。我创建了一个节点 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