如何使用Python从链表中删除给定节点
我在用python学习链表 有人能告诉我如何从链表中删除特定的give节点吗如何使用Python从链表中删除给定节点,python,algorithm,data-structures,linked-list,Python,Algorithm,Data Structures,Linked List,我在用python学习链表 有人能告诉我如何从链表中删除特定的give节点吗 #!/usr/bin/python class Node(object): def __init__(self, data=None,
#!/usr/bin/python
class Node(object):
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __str__(self):
return str(self.data)
def print_list(node):
while node:
print node,
node = node.next
print
def delete_node(node, node_to_remove):
if first_node == None:
return
pass
# way of creating linked list
def create_linked_list1(n):
linked_list = Node(1)
head = linked_list
for i in range(1, n):
head.next = Node(i)
head = head.next
return linked_list
node1 = create_linked_list1(10)
print_list(node1)
假设以下单链接列表带有指向第一个节点的指针
head
头部⇢ n0→ n1→ … → ni-1→ n i→ n i+1→ … → n-1→ 无
def delete(i):
if i == 0: # there is no prev node, increment head
head = head.next
else:
prev = get_node(i-1) # find prev node, node[i-1]
prev.next = prev.next.next # remove node i
因为这是一个单链表get_节点(i-1)
必须从head
开始,并递增i-1
次才能找到节点
注意:如果这是一个双链接列表,给定
节点[i]
您可以使用节点[i]找到节点[i-1]
。prev
显而易见的解决方案是:
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
如何简化这一点应该是显而易见的,您应该这样做
另一种选择是排除“搜索”和“删除”部分。编写一个n
函数(这应该很容易),然后您可以执行以下操作:
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\u by\u index
或nth
(这是最容易编写的递归函数之一)
您可能还希望捕获由于删除(例如)10节点列表中的第15个节点而导致的错误,并使其变得更好。找出在这种情况下会出现什么错误(或者,如果无法找到,只需运行它并查看),然后尝试除此之外的/,并提出一个索引器
当您使用时,您可能需要添加一个delete\u by_data(node,data)
函数,或者添加一个delete\u by_identity(node,child\u node)
,以便进一步练习。v->w->x->y>z如果我们想要删除x,则新的链表是v->w->y->z,并且我们只能访问x
下一个节点到x的位置,即节点Y的位置
next_node=x.next
将Y替换为X,然后删除Y`X.data=next_node.data
x、 next=next\u data.next在单链表中使用python删除节点
def删除(自身、数据):
按值删除:
def delete(head, val):
if head is None:
return None
prev = head
temp = head.next
while temp is not None:
if temp.val == val:
prev.next = temp.next
return val
else:
prev = temp
temp = temp.next
return None
请向我们展示您的链表实现。除非我们知道您是如何实现的,否则无法显示与您的实现配合使用的delete
函数。更新后,请验证它,并告知我如何删除给定节点。您是否尝试按标识、值或索引删除?我应该说是按索引删除。无论如何,这不包括删除节点0的情况。在无哨兵的链表实现中,这总是使事情复杂化。您应该澄清get\u node
方法。这不是完整的答案谢谢,阅读你的答案,我认为你应该写下n
函数将是一个很好的答案。
def delete(head, val):
if head is None:
return None
prev = head
temp = head.next
while temp is not None:
if temp.val == val:
prev.next = temp.next
return val
else:
prev = temp
temp = temp.next
return None