【问题标题】:How to delete a given node from a linked list using Python如何使用 Python 从链表中删除给定节点
【发布时间】:2013-12-19 00:51:14
【问题描述】:

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

【问题讨论】:

  • 请向我们展示您的链表实现。除非我们知道您是如何实现的,否则我们无法显示与您的实现一起使用的 delete 函数。
  • 已更新,请验证并告诉我如何删除给定节点
  • 您是按标识、按值还是按索引删除?
  • 我应该按索引说。

标签: python algorithm data-structures linked-list


【解决方案1】:

显而易见的解决方案是这样的:

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 那个,然后提出@改为 987654329@。

当您使用它时,您可能需要添加一个delete_by_data(node, data) 函数,也许还需要添加一个delete_by_identity(node, child_node) 以供进一步练习。

【讨论】:

  • 谢谢您,阅读您的回答,
  • 我认为你应该写下nth 函数会是一个很好的答案。
【解决方案2】:

假设以下单链表带有指向第一个节点的指针head

head ⇢ n<sub>0</sub> → n<sub>1</sub> → … → n<sub> i - 1</sub> → n<sub> i</sub> → n<sub> i + 1</sub> → … → n<sub> N-1</sub> → 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].prev 找到node[i-1]

【讨论】:

  • 无论如何,这不包括删除节点 0 的情况。在无标记链表实现中,这总是使事情复杂化。
  • 你应该澄清get_node 方法。这不是完整的答案
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    在单链表中使用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
    

    【讨论】:

      【解决方案5】:

      按值删除:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        相关资源
        最近更新 更多