c - 仅使用单个指针字段存储双向链表

标签 c doubly-linked-list

最近,我读了一篇文章,向我展示了如何实现一个只有一个指针字段的双向链表,即,像一个单链表。与将 XOR prev 和 next 地址存储在单个字段中有关。我不明白这如何帮助我们前后遍历?谁可以给我解释一下这个?我已经阅读了这篇文章 here .谁能给我解释一下?更详细一点?以及异或与这些地址有什么关系。

最佳答案

正如文章所指出的,只有在列表的头部或尾部有一个指针时,这种技术才有用;如果列表中间只有一个指针,则无处可去。

关于该技术:考虑以下链表:

|0|A|0x01|<->|0x01|B|0x02|<->|0x02|C|0|

该列表包含 3 个节点,其值为 A、B、C 和包含列表中上一个/下一个元素的十六进制值(地址)的上一个/下一个指针。值 0 为空

我们可以只使用一个,而不是存储 2 个指针,如文章中所述:

|A|0x01|<->|B|0x03|<->|C|0x03| 

接下来我们将调用新字段 link = prev XOR。所以考虑到这一点:

    A.link = 0^0x01 = 0x01
    B.link = 0x01^0x02 = 0x03
    C.link = 0x03^0x0 = 0x03. 

假设您有一个指向列表头部的指针(您知道它的 prev 指针设置为空),下面是您如何遍历列表:

 p=head; 
 prev = 0;
 while(p.link!=prev)
 {
   next = p.link^prev
   prev=p
   p=next 
 }

您使用相同的逻辑在列表中向后移动

关于c - 仅使用单个指针字段存储双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21528422/

相关文章:

java - 如何将双向链表中的节点与其前一个节点交换

c - 使用C获取文件名列表并将它们存储在Linux上的数组中

c++ - c语言中bool for function

c - c中使用双向链表的插入排序算法——插入节点

c++ - 如何在我的自定义列表迭代器类中将迭代器转换为 const_iterator?

c++ - C++链表声明中的语法错误

c++ - 需要结构包含/实现帮助(第 2 部分)C++

c - 使用 fprintf 正确保存数据,但打印出奇怪的值

javascript - Chrome 在从 libwebsockets 接收时说 "Could not decode a text frame as UTF-8"

c - 使用并行算法进行求和减少 - 与 CPU 版本相比性能较差