c++ - 包含双指针的单链表的正确名称是什么?

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

最近,我看到了这个:

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;
};

最佳答案

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

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

关于c++ - 包含双指针的单链表的正确名称是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11805261/

相关文章:

c++ - 示例void_t示例无法使用intel编译器19.0.4进行编译

android - 在 Android 上运行自己的 TensorFlow 模型会出现 native 推理错误 : "Session was not created with a graph before Run()!"

c - 在 C 中,文字字符串地址是否总是大于任何分配的字符串地址?

java - 为什么 TreeSet 对 SortedSet 有一个单独的构造函数,而任何 Collection 已经有一个构造函数?

c++ - 为什么 file.write() 不按照我给出的顺序存储字节? C++

c++ - 在 C++ 应用程序中使用非本地数据/媒体文件 (gtkmm)

c - 如何有效地解决 C 中的差一错误?

c - Visual Studio 2013 : Access violation when attempt to change value of variable obtained from LockResource()

algorithm - 前缀和如何成为批量同步算法原语?

algorithm - 一个数能否表示为2的n次方?这个逻辑如何运作?