📜  XOR链表–具有内存效率的双链表|套装1

📅  最后修改于: 2021-04-17 11:19:52             🧑  作者: Mango

普通的双向链接列表需要两个地址字段的空间来存储上一个和下一个节点的地址。可以仅在每个节点的地址字段中使用一个空格来创建内存高效版本的双链表。这种高效内存的双链表称为XOR链表或内存高效,因为该表使用按位XOR操作来节省一个地址的空间。在XOR链接列表中,每个节点都存储前一个和下一个节点的地址的XOR,而不是存储实际的内存地址。

考虑上面的双链表。以下是双链表的普通和XOR(或Memory Effiecient)表示形式。

普通代表:
节点A:
prev = NULL,next = add(B)//上一个为NULL,下一个为B的地址

节点B:
prev = add(A),next = add(C)//上一个是A的地址,下一个是C的地址

节点C:
prev = add(B),next = add(D)//上一个是B的地址,下一个是D的地址

节点D:
prev = add(C),next = NULL //上一个是C的地址,下一个是NULL

XOR列表表示形式:
让我们以XOR表示形式npx(下一个和上一个的XOR)调用地址变量

节点A:
npx = 0 XOR add(B)//零与B的地址按位XOR

节点B:
npx = add(A)XOR add(C)// A地址和C地址的按位XOR

节点C:
npx = add(B)XOR add(D)// B地址与D地址的按位XOR

节点D:
npx = add(C)XOR 0 // C和0的地址的按位XOR

遍历XOR链接列表:
我们可以在正反两个方向上遍历XOR列表。在遍历列表时,我们需要记住先前访问的节点的地址,以便计算下一个节点的地址。例如,当我们在节点C上时,我们必须具有地址B。add (B)的XOR和C的npx给我们add(D)。原因很简单:npx(C)是“ add(B)XOR add(D)”。如果我们用add(B)对npx(C)进行异或,则得到的结果为“ add(B)XOR add(D)XOR add(B)”,即“ add(D)XOR 0”,即“ add” (D)”。因此,我们有了下一个节点的地址。同样,我们可以向后遍历列表。

在下面的文章中,我们将在XOR链接列表中介绍更多内容。

XOR链表–具有内存效率的双链表|套装2

参考:
http://en.wikipedia.org/wiki/XOR_linked_list
http://www.linuxjournal.com/article/6828?page=0,0