异或链表

单向链表
双向链表
循环链表
跳表
异或链表

示例练习>>>

异或链表(XOR linked list)可以在降低空间复杂度的情况下达到和双向链表一样的目的,使得在任何一个节点都能方便地访问它的前驱节点和后继节点。双向链表一般有三个变量,一个是指向前一个节点,一定是指向后一个节点,一个是存放数据。而异或链表只需要两个变量即可,一个存放前一个节点地址与后一个节点地址的异或值,一个存放数据,如下图所示。

如果现在处于节点 B ,想求节点 C 的地址,只需要用 A 的地址 addr(A) 与 B 中存储的值 addr(A)^addr(C) 进行异或运算即可,在位运算介绍中我们讲过异或运算具有交换律,所以得到下面的公式:

addr(A) ^ link(B)
= addr(A) ^ (addr(A) ^ addr(C))
= 0 ^ addr(C)
= addr(C)

如果现在处于节点 B ,想求节点 A 的地址,只需要用 C 的地址 addr(C) 与 B 中存储的值 addr(A)^addr(C) 进行异或运算即可。

addr(C) ^ link(B)
= addr(C) ^ (addr(A) ^ addr(C))
= addr(A) ^ addr(C) ^ addr(C)
= addr(A)

异或链表有很大的局限性,因为是地址异或,在 C 以及 C++ 中可以直接访问变量的地址,所以很容易实现。但在 Java 和其他的一些语言中,由于不能直接访问变量的地址,所以一般情况下都使用不到,对异或链表只需要理解即可。

参考:XOR Linked List

相关链接

数组
数组滚动数组差分数组树状数组
链表
链单向表双向链表循环链表跳表异或链表
队列
队列循环队列双端队列
散列表
散列表
二叉树二叉搜索树AVL树红黑树字典树哈夫曼树线段树笛卡尔树
图的介绍图的遍历Dijkstra算法Bellman-Ford算法SPFA算法Floyd算法Prim算法Kruskal算法Boruvka算法拓扑排序

信奥赛编程(刷题请进)>>>

经过两年的打磨,我的新作《算法秘籍》已经出版,有需要的可以点击购买。也可以点击 内容介绍 查看详情。