将指针称为“常规”整数。因此,您可以对其进行任何整数运算,包括异或。
对于每个节点,存储xorValue = next ^ previous
.
为什么有帮助?
如果你从前端迭代到后端——你知道在哪里previous
,并且你有它的价值,所以你可以用next = xorValue ^ previous
.
当从最后一个迭代到第一个时,同样的想法也适用:previous = xorValue ^ next
.
这已经足够了,因为如果不从最后一个到第一个或从第一个到最后一个迭代,您将无法到达链表中的任何位置 - 所以previous
OR的值next
是您已知的,正如我们所看到的 - 这就是您获得另一个。
基于此,您可以创建(类似 c 的伪代码):
struct Node {
void* data;
int xorValue;
}
Node* next(Node* node, void* previous) {
return (Node*)(node->xorValue ^ (int)previous));
}
Node* previous(Node* node, void* next) {
return (Node*)(node->xorValue ^ (int)next));
}
对于头/尾元素 - 将上一个/下一个值(相应地)简单地视为 NULL (0),并按原样存储下一个元素。它的工作原理是next ^ 0 = next