我正在尝试使用python学习链表,
有人可以指导我如何从链接列表中删除特定的给定节点吗?
#!/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)
答案 0 :(得分:4)
显而易见的解决方案是:
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)
才能进一步练习。
答案 1 :(得分:2)
假设以下单链表指针head
到第一个节点
head ⇢ n0 → n1 → … → n i - 1 → n i → n i + 1 → … → n N-1 → None
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_node(i-1)
,因此必须从head
开始并增加i-1
次才能找到该节点。
注意:如果这是双重链接列表,给定node[i]
,您可以使用node[i-1]
找到node[i].prev
。
答案 2 :(得分:0)
V-> W-> X-> Y> z如果我们想要删除x以便新的链接列表是v - > W-> Y-> z,我们只能访问x
next_node = x.next
x.next = next_data.next
答案 3 :(得分:0)
在单个链表中使用python删除节点。
def delete(self,data):
if self.head.data==data:
temp=self.head.next
del self.head
self.head=temp
else:
p=self.head
while p.next.data!=data:
p=p.next
temp=p.next.next
del p.next
p.next=temp
答案 4 :(得分:0)
按值删除:
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