以下链接对此进行了说明。 据说该实现是通过存储前一个和下一个地址(例如nxp)的XOR来工作的,而不是分别存储(前一个和下一个地址)两者的。但是,进一步说实现是 通过 对前一个地址进行 异或来 工作的和nxp,以获得 下一个地址 。
但是,这实际上不是使用 与 具有上一个和下一个指针 相同的空间 吗?
在双向链接列表中,每个节点存储两个指针:prev和next。在XOR链接列表中,每个节点存储一个“指针”,即“上一个”和“下一个”的XOR(或者,如果不存在其中一个,则另一个(与0进行XOR运算))。您仍然可以双向遍历XOR链表的原因取决于XOR的属性以及双链表中固有的信息冗余。
想象一下,您的XOR链接列表中有三个节点。
A是头部,并且具有指向B的明确指针(B XOR 0,仅下一个)
B是中间元素,并且具有指向A和C的指针的XOR。
C是尾巴,并且是指向B的明确指针(0 XOR B,仅上一个)
当我遍历此列表时,我从A开始。当我前往B时,我注意到A在内存中的位置。当我希望前往C时,我将B的指针与A进行异或,将指针授予C。然后,我注意到B在内存中的位置并移至C。
之所以行之有效,是因为XOR具有两次应用的撤销属性:C XOR A XOR A ==C。另一种思考方式是,双链表不存储任何额外信息,而单链表则不存储(因为它只是存储)所有先前的指针作为下一个指针的副本在内存中的其他位置),因此,通过利用这种冗余,我们可以使双链表属性具有所需数量的链接。 但是, 这仅在我们从头开始或结束开始XOR链表遍历的情况下有效-就像我们只是跳到中间的随机节点一样,我们没有开始遍历所需的信息。
XOR链表虽然具有较小的内存使用量的优点,但也有弊端- 它将混淆编译器,调试和静态分析工具,因为除代码外,其他任何指针都无法正确识别两个指针的XOR。这也减慢了指针访问的速度,因此必须先执行XOR操作才能恢复真正的指针。它也不能在托管代码中使用- XOR混淆的指针将不会被垃圾收集器识别。