异或链表的结构

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

...  A       B         C         D         E  ...
–> next –> next –> next –>
<– prev <– prev <– prev <–
双向链表如上面所示,每个节点有两个指针,分别指向该节点的前驱和后继。
而XOR链表如下面所示:
 ...  A        B         C         D         E  ...
<–> A⊕C <-> B⊕D <-> C⊕E <->
多余的一个指针中存放的地址的异或。 比如B中就存放了A⊕C的值。
这样从头开始便利时,我们需要知道开始的两个节点(而不像普通链表只需要一个)。
这样比如知道了节点A和节点B 我们就可以用节点A的地址和B中的A⊕C 结合运算,得到A⊕A⊕C 得到C。 这是正向遍历
反向遍历时类似,比如知道了节点E和D,就可以利用E的地址和D中的C⊕E 运算,得到C⊕E⊕E 得到C
 

但是,该结构用以做研究学习使用,实际中我们并不推荐使用,主要由于以下原因

  1. 常用的debug工具不支持XOR的链表,是的debug更麻烦。
  2. 是通过增加代码的复杂度来减低内存开销的,增加了维护的成本
  3. 通常的垃圾回收机制对于这种表示无法正常工作
  4. 尽管大部分语言都支持,但是仍有一些语言不支持XOR操作。
  5. 不是在遍历链表时,指针是无意义的。例如另外的数据结构也包含了链表中的指针。
  6. 遍历链表时,为了计算下个指针的地址,你需要记住前一个节点的地址。
  7. XOR链表也无法提供双向链表提供的一些功能。比如仅知道一个节点是将该节点从链表移除或者在仅知道一个节点时再该节点后面插入一个节点。

随着资源越来越便宜,内存越来越大,除了在一些嵌入式系统中,内存将不再是一个非常重要的因素。

该结构的变形

加法链表:放地址的和

 ...  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 linked list--- 异或链表的更多相关文章

  1. 异或链表(XOR linked list)

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

  2. [CareerCup] 2.6 Linked List Cycle 单链表中的环

    2.6 Given a circular linked list, implement an algorithm which returns the node at the beginning of ...

  3. [CareerCup] 2.7 Palindrome Linked List 回文链表

    2.7 Implement a function to check if a linked list is a palindrome. LeetCode上的原题,参见我之前的博客Palindrome ...

  4. [LeetCode] Linked List Random Node 链表随机节点

    Given a singly linked list, return a random node's value from the linked list. Each node must have t ...

  5. [LeetCode] Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...

  6. [LeetCode] Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  7. [LeetCode] Reverse Linked List II 倒置链表之二

    Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1-> ...

  8. leetcode:Intersection of Two Linked Lists(两个链表的交叉点)

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  9. lintcode 中等题: reverse linked list II 翻转链表II

    题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...

随机推荐

  1. 在Ubuntu下安装source Insight

    在ubuntu中,安装windows程序用wine,然后用wine安装windows软件即可. 安装wine sudo apt-get install wine 下载sourceinsight的exe ...

  2. windows如何在当前路径下快速打开cmd

    直接在打开的文件夹地址栏当中输入cmd即可.

  3. vector 有点麻烦啊 能简单点么?

    #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> ...

  4. PHP-缺失的第一个正数

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0]输出: 3示例 2: 输入: [3,4,-1,1]输出: 2示例 3: 输入: [7,8,9,11,12] ...

  5. mysql中创建函数

    MySql创建函数 一.查看创建函数的功能是否开启: mysql> show variables like '%func%'; +-------------------------------- ...

  6. 二进制搭建一个完整的K8S集群部署文档

    服务器规划 角色 IP 组件 k8s-master1 192.168.31.63 kube-apiserver kube-controller-manager kube-scheduler etcd ...

  7. js关闭当前窗口的几种方法

    第一种:不带任何提示关闭窗口的js代码 <a href="javascript:window.opener=null;window.open('','_self');window.cl ...

  8. Java 基础 - 继承

    子类继承父类的private字段么? Oracle的Java Documentation对Inheritance的定义: 很直白,定义里面就告诉你了这不叫继承.继承的意思是你可以对其进行直接的调用和修 ...

  9. MySql5.7默认生成的密码无法正常登陆

    1.修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2.重启 mysqld 服务:sys ...

  10. 文件系统类型(ext4、ntfs)

    Linux 1.Linux:存在几十个文件系统类型:ext2,ext3,ext4,xfs,brtfs,zfs(man 5 fs可以取得全部文件系统的介绍) 不同文件系统采用不同的方法来管理磁盘空间,各 ...