XOR链表— 一个空间高效的双向链表
传统的双向链表,要求有两个地址阈,分别存储前一个和后一个节点的地址。这里我们提到的空间高效的双向链表,仅仅为每一个节点申请一个地址空间,这空间有效的双向链表叫做XOR链表。在XOR链表中不在存储一个确定的地址,而是对于每一个节点存储前一个地址和后一个地址的XOR值。
看上面的双向链表,这是原始的双向链表,下面简单介绍其和XOR链表的不同。
传统的双向链表:
Node A:
prev = NULL,next = add(B) // 表示前一个是NULL,下一个节点的地址是B
Node B:
prev = add(A),next = add(C) // 表示前一个节点地址是A,下一个节点的地址是C
Node C:
prev = add(B),next = add(D) // 表示前一个节点地址是B,下一个节点的地址是D
Node D:
prev = add(C),next = NULL // 表示前一个节点地址是C,下一个节点是NULL
XOR链表:
在每一个节点中的地址变量是前一个地址和后一个地址的亦或值(XOR of next and previous)
我们将这个变量表示成xnp。
Node A:
npx = 0 XOR add(B) //位运算XOR, 0和地址B的XOR值
Node B:
npx = add(A) XOR add(C) //位运算, 地址A和地址B的XOR值
Node C:
npx = add(B) XOR add(D) //位运算, 地址B和地址D的XOR值
Node D:
npx = add(C) XOR 0 //位运算, 地址C和0的XOR值
访问XOR双向链表:
我们可以根据简单的亦或操作,从前往后或者从后往前的访问这个双向链表,但是访问的时候要保留前一个节点的地址。
例如当我们在No