这是一个数据结构。利用计算机的的位异或操作(⊕),来降低双向链表的存储需求。

...  A       B         C         D         E  ...
–> next –> next –> next –>
<– prev <– prev <– prev <–
双向链表如上面所示,每个节点有两个指针,分别指向该节点的前驱和后继。
而XOR链表如下面所示:An XOR linked list compresses the same information into one address field by storing the bitwise XOR of the address for previous and the address for next in one field:
 ...  A        B         C         D         E  ...
<–> A⊕C <-> B⊕D <-> C⊕E <->
 link(B) = addr(A)⊕addr(C), link(C) = addr(B)⊕addr(D), ..
要求addr(D),使用:addr(D) = link(C) ⊕ addr(B)
地址指针中存放的地址的异或。 比如B中就存放了A⊕C的值。
这样从头开始便利时,我们需要知道开始的两个节点(而不像普通链表只需要一个)。
这样比如知道了节点A和节点B 我们就可以用节点A的地址和B中的A⊕C 结合运算,得到A⊕A⊕C 得到C。 这是正向遍历
反向遍历时类似,比如知道了节点E和D,就可以利用E的地址和D中的C⊕E 运算,得到C⊕E⊕E 得到C.

To start traversing the list in either direction from some point, you need the address of two consecutive items, not just one. If the addresses of the two consecutive items are reversed, you will end up traversing the list in the opposite direction.

This form of linked list may be inadvisable: 异或链表不推荐使用:

  • General-purpose debugging tools cannot follow the XOR chain, making debugging more difficult; [1]
  • The price for the decrease in memory usage is an increase in code complexity, making maintenance more expensive; 虽然内存使用减少了,但代码复杂量增加了,使维护更加昂贵。
  • Most garbage collection schemes do not work with data structures that do not contain literal pointers;通常的垃圾回收机制对于这种表示无法正常工作
  • XOR of pointers is not defined in some contexts (e.g., the C language), although many languages provide some kind of type conversion between pointers and integers;
  • The pointers will be unreadable if one isn't traversing the list — for example, if the pointer to a list item was contained in another data structure;不是在遍历链表时,指针是无意义的。例如另外的数据结构也包含了链表中的指针。
  • While traversing the list you need to remember the address of the previously accessed node in order to calculate the next node's address.
  • XOR linked lists do not provide some of the important advantages of doubly-linked lists, such as the ability to delete a node from the list knowing only its address or the ability to insert a new node before or after an existing node when knowing only the address of the existing node.XOR链表也无法提供双向链表提供的一些功能。比如仅知道一个节点是将该节点从链表移除或者在仅知道一个节点时再该节点后面插入一个节点。

Computer systems have increasingly cheap and plentiful memory, and storage overhead is not generally an overriding issue outside specialized embedded systems. Where it is still desirable to reduce the overhead of a linked list, unrolling provides a more practical approach (as well as other advantages, such as increasing cache performance and speeding random access).

实现代码:http://blog.wsensors.com/2011/04/the-xor-linked-list-in-c/

类似的变形

加法链表:放地址的和

 ...  A        B         C         D         E  ...
<–> A+C <-> B+D <-> C+E <->
减法链表:放地址的差
...  A        B         C         D         E  ...
<–> C-A <-> D-B <-> E-C <->
不同是正向和反向需要做不同的运算。

参考:http://en.wikipedia.org/wiki/XOR_linked_list

XOR双向链表的更多相关文章

  1. 异或链表(XOR linked list)

    异或链表(Xor Linked List)也是一种链式存储结构,它可以降低空间复杂度达到和双向链表一样目的,任何一个节点可以方便的访问它的前驱节点和后继结点.可以参阅wiki 普通的双向链表 clas ...

  2. CLRS10.2-8练习 - 单指针值实现双向链表

    要求: Explain how to implement doubly linked lists using only one pointer value x.np peritem instead o ...

  3. XOR linked list--- 异或链表

    异或链表的结构 这是一个数据结构.利用计算机的的位异或操作(⊕),来降低双向链表的存储需求. ... A B C D E ... –> next –> next –> next –& ...

  4. 学习Redis你必须了解的数据结构——双向链表(JavaScript实现)

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  5. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  6. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. 双向链表、双向循环链表的JS实现

    关于链表简介.单链表.单向循环链表.JS中的使用以及扩充方法:  单链表.循环链表的JS实现 关于四种链表的完整封装: https://github.com/zhuwq585/Data-Structu ...

  8. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  9. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

随机推荐

  1. return 和 echo 的小坑

    在写项目的时候,有好几次遇到过同样的问题,控制器里面返回的json在前台无显示,利用console.log()总是显示这样的现象 数据库操作成功,却没有返回值. 原因是在控制器返回的使用使用了 ret ...

  2. ASP.NET页面继承关系

    用过ASP.NET(以下简称ASP)的都知道ASP以一种Code Behind的方式给咱展现了一种类似Winform的开发模型,同样也是以"事件触发"的方式进行各种请求处理.其中A ...

  3. 正确决解Hibernate4.*中:Connection cannot be null when 'hibernate.dialect' not set

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  4. Delphi常见图象格式转换技术

    TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf ...

  5. ASP.NET自定义控件加载资源WebResource问题

    最近项目用日期控件,想把My97的资源文件跟TextBox封装成一个DatePicker控件,其实很简单的意见事情,但是还是用了一天多的时间,主要的问题就是解决资源文件加载的问题.通过一天多的努力,得 ...

  6. 中国市场 Android App 兼容性报告

      由于手机操作系统的不同,以及操作系统版本之间的差异,使得真机测试这个过程尤其复杂,涉及终端.人员.工具.时间.管理等方面的问题,Android系统的设备因操作系统多样性和终端类型的庞杂,问题尤为复 ...

  7. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  8. [置顶] 通过实例学习Struts2 (1)

    前言 一直用Struts1 , 现在新的项目要转向Struts2了, 先研究学习一下,做点技术储备. 我一直认为计算机软件行业是一个实践性非常强的行业,书读了多少都不管用, 一定要卷起袖子,亲自动手, ...

  9. SQLite使用报告

    SQLite简介 SQLite是遵守ACID的关联式数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目. 不像常见的客户-服务器范例,SQLite引擎不是个程 ...

  10. C++隐式转换

    #include <iostream> using namespace std; class A { int a; public: A(int n):a(n) { cout << ...