如何使用Python从链表中删除给定节点

如何使用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,

我在用python学习链表

有人能告诉我如何从链表中删除特定的give节点吗

#!/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