【问题标题】:Delete a node in singly link list删除单链表中的一个节点
【发布时间】:2010-12-29 22:54:34
【问题描述】:

如何删除单链表中只有一个指针指向待删除节点的节点?

[开始和结束指针未知,可用信息是指向应该删除的节点的指针]

【问题讨论】:

    标签: c data-structures pointers linked-list


    【解决方案1】:

    您可以在不获取前一个节点的情况下删除一个节点,方法是让它模仿以下节点并删除那个节点:

    void delete(Node *n) {
      if (!is_sentinel(n->next)) {
        n->content = n->next->content;
        Node *next = n->next;
        n->next = n->next->next;
        free(next);
      } else {
        n->content = NULL;
        free(n->next);
        n->next = NULL;
      }
    }
    

    如您所见,您需要专门处理最后一个元素。我正在使用一个特殊节点作为哨兵节点来标记具有contentnext 的结尾是NULL

    更新:Node *next = n->next; n->next = n->next->next 行基本上会打乱节点内容,并释放节点:您获得要删除的节点 B 引用的图像:

       A           / To be deleted
      next   --->  B
                  next  --->    C
                               next ---> *sentinel*
    

    第一步n->content = n->next->content:将以下节点的内容复制到要“删除”的节点:

       A           / To be deleted
      next   --->  C
                  next  --->    C
                               next ---> *sentinel*
    

    然后,修改next点:

       A           / To be deleted
      next   --->  C       /----------------
                  next  ---|    C          |
                               next ---> *sentinel*
    

    实际上释放了以下元素,进入最后的情况:

       A           / To be deleted
      next   --->  C
                  next  --->    *sentinel*
    

    【讨论】:

    • 节点 *next = n->next; n->下一个 = n->下一个->下一个;你能详细说明一下吗?
    • 如果链表足够长,那么移动内容是否可行?
    • @unknown,是的,这将是一个可行的解决方案。这种方法可能会使别名复杂化(另一个代码包含对受影响节点的引用等);但无论如何你都会拥有它。
    • 请注意,这仅在您没有指向以下节点的指针时才有效。
    • 请注意,移位并没有真正发生。您只需将一个节点的内容复制到另一个节点。列表的实际长度无关紧要。
    【解决方案2】:

    不可能。

    有模仿删除的技巧。

    但是这些都不会真正删除指针指向的节点。

    删除跟随节点并将其内容复制到要删除的实际节点的流行解决方案如果您有外部指针 指向链表中的节点,在这种情况下,指向下一个节点的外部指针会悬空。

    您可以在 SO here 上找到一些讨论。

    【讨论】:

      【解决方案3】:

      在这种限制下,唯一明智和安全的选项是将节点标记为已删除而不实际取消链接,将其推迟到以后。

      【讨论】:

      • 不是唯一的选择,而是一个很好的选择,所以 +1。我们在系统中使用标记未使用/延迟删除来执行此操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      相关资源
      最近更新 更多