我正在尝试在python中创建一个链表类(我知道这是无意义的,但这是一个学习练习),如果我尝试删除第一个元素,我编写的删除节点的方法不起作用链表。如果要删除的节点是链表中的任何其他位置,则该方法可以正常工作。有人能给我一些关于我哪里出错的见解吗?
到目前为止,这是我的代码:
class Node:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __repr__(self):
return repr(self.data)
def printNodes(self):
while self:
print self.data
self = self.next
def removeNode(self, datum):
"""removes node from linked list"""
if self.data == datum:
return self.next
while self.next:
if self.next.data == datum:
self.next = self.next.next
return self
self = self.next
答案 0 :(得分:1)
修改removeNode
,使其始终返回链表的头部,然后将结果分配回头节点。像这样:
def removeNode(self, datum):
"""removes node from linked list and returns head node"""
head = self
curr_node = self
if curr_node.data == datum:
head = curr_node.next
else:
while curr_node.next:
if curr_node.next.data == datum:
curr_node.next = self.next.next
break
curr_node = curr_node.next
return head
或者,如果您想避免必须将removeNode
的结果分配回头:
def removeNode(self, datum):
"""removes node from linked list"""
curr_node = self
if curr_node.data == datum:
# steals the the data from the second node
curr_node.data = curr_node.next.data
curr_node.next = curr_node.next.next
else:
while curr_node.next:
if curr_node.next.data == datum:
curr_node.next = curr_node.next.next
break
curr_node = curr_node.next
注意:我已将self
分配给curr_node
,因为修改self
感觉不对。
答案 1 :(得分:0)
如代码所示,removeNode
方法返回链接列表的新第一个节点。您应该使用head = head.removeNode(1)
而不是只调用方法。