【问题标题】:What is the proper name of a singly linked list containing a double pointer?包含双指针的单链表的正确名称是什么?
【发布时间】:2012-08-02 01:33:59
【问题描述】:

最近,我看到了这个:

struct node {
    node*  pNext;
    node** pPrevNext;
};

void insert_before(node** pNext, node* toInsert) {
    toInsert->pNext = *pNext;
    toInsert->pPrevNext = pNext;
    if (*pNext) (*pNext)->pPrevNext = &toInsert->pNext;
    *pNext = toInsert;
};

// node *a, *b;
// insert_before(a->pPrevNext, b);

它看起来像一个单链表,但包含指向前一个节点的下一个指针的指针。我的问题很简单:这个是什么?没有它的“真名”,在 StackOverflow 和整个互联网上搜索有关此数据结构的信息都是空的。

注意它不是一个双向链表,看起来像这样:

struct node {
    node* pNext;
    node* pPrev;
};

【问题讨论】:

  • 也许我在这里遗漏了一些东西,不是 C/C++ -er,但不是指向前一个节点的下一个指针的节点指针,而是指向指向该节点的指针的指针? ...有什么用?
  • @Matt Ball 用途是允许O(1)删除或者insert-before。
  • @Blair:您能解释一下您编辑中的第三点吗?在我看来,这个修改后的双向链表的插入操作仍然需要写入三个节点。我不明白这种列表节点和更标准的双向链表节点之间的这个属性有何不同。
  • 另外,第二点根本不适用于许多双向链表实现(例如 Linux 的 list.h 中的那个)——插入/删除没有特殊情况,因为没有节点指针永远为 NULL。
  • @MichaelBurr -- 在考虑了您的问题之后,我现在认为我在编辑中所做的其他陈述是不正确的。因此,我已经删除了它们。

标签: c++ c data-structures linked-list doubly-linked-list


【解决方案1】:

之所以称为双向链表,是因为它有两个指针。您可以从像container_of(*node.pPrevNext, node, pNext) 这样的宏中获取前一个节点,因此它在逻辑上也等同于标准的双向链表。

注意:有趣的问题是异或列表被认为是单链接还是双链接?见XOR Doubly Linked List

【讨论】:

    【解决方案2】:

    我认为没有任何标准名称;这是双向链表的一种受限版本,因为您可以在完整的双向链表中遍历指针以获取此处可用的所有信息。

    【讨论】:

      【解决方案3】:

      这是一个单链表,允许在 O(1) 时间内删除一个节点,或在其前面插入一个节点。它没有名字,因为没有理由使用它……双向链表更好。

      【讨论】:

        【解决方案4】:

        这是一个单链表,旨在表现得像一个双链表。你可以删除一个元素

        *pPrevNext = pNext;

        唯一阻止它成为双向链表的是作者对这个概念的理解不足。

        【讨论】:

          猜你喜欢
          • 2010-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 2019-06-10
          • 2010-09-18
          • 1970-01-01
          相关资源
          最近更新 更多