我创建了一个带有删除方法的链表类。我已经编写了无论什么情况都删除节点的代码,就像
代码:
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 : 删除头节点失败
这里有什么问题?
在
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