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

时间:2013-12-03 04:50:04

标签: python algorithm data-structures linked-list

我正在尝试使用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)

5 个答案:

答案 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_indexnth(这是最容易编写的递归函数之一)。

您可能还想捕获由于删除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

下一个节点到x的位置,即节点Y的位置

next_node = x.next

将Y交换为X,然后删除Y`x.data = next_node.data

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