显而易见的解决方案是:def delete_by_index(node, index):
for _ in range(index):
prev_node, node = node, node.next
prev_node.next = node.next
但是,这将无法删除第一个节点。为了做到这一点,您需要让它返回新的列表头,它通常是旧的列表头,但是在您删除头的情况下,它将是旧的第二个节点。所以:def delete_by_index(node, index):
if not index:
return node.next
head = node
for _ in range(index):
prev_node, node = node, node.next
prev_node.next = node.next
return head
如何简化这一点应该是显而易见的,你应该这样做。
另一个选择是去掉“搜索”和“删除”部分。编写一个nth函数(这应该很简单),然后您可以执行以下操作:def delete_by_index(node, index):
if not index:
return node.next
prev_node = nth(node, index-1)
prev_node.next = prev_node.next.next
return node
如果您知道递归函数,您可能还想知道如何递归地编写delete_by_index或nth(这是最容易编写的递归函数之一)。
您可能还希望捕获由于删除10节点列表中的第15个节点而导致的错误,并使其变得更好。弄清楚在这种情况下会得到什么错误(或者,如果你不能弄清楚,只需运行它并查看),然后try/except,然后引发一个IndexError。
在这个过程中,您可能需要添加一个delete_by_data(node, data)函数和一个delete_by_identity(node, child_node)函数,以便进一步练习。