双重链表

时间:2013-02-01 05:52:47

标签: algorithm data-structures linked-list

解释如何使用每个项目仅使用一个指针值np [x]而不是通常的两个(next和prev)来实现双向链表。假设所有指针值都可以解释为k位整数,并且def ine np [x]为np [x] = next [x] XOR prev [x],k位“exclusive-or”ofnext [x ]和上一页[x]。 (值NIL由0表示。)请务必描述访问列表头部所需的信息。演示如何在此类列表上实现SEARCH,INSERT和DELETE操作。还显示了如何在O(1)时间内反转这样的列表。

资料来源:Cormen第三版CLRS 10.2-8

PS:这不是一个家庭作业问题。我正在练习/修改数据结构。

1 个答案:

答案 0 :(得分:1)

将指针指定为'常规'整数。因此,您可以对其执行任何整数运算,包括xor。

对于每个节点,请存储xorValue = next ^ previous

为什么有用?
如果你是从前到后进行迭代 - 你知道previous在哪里,并且你有它的价值,那么你可以使用next = xorValue ^ previous获得下一个。
从倒数第一个迭代时适用相同的想法:previous = xorValue ^ next

这已经足够了,因为你不能到达链表中的任何地方而不会从最后一个到第一个或从头到尾迭代 - 所以你知道previousnext的值,因为我们已经看到 - 这是你需要的所有才能得到另一个。

基于此,您可以创建(类似于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));
}

对于head / last元素 - 将上一个/下一个值(相应地)视为NULL(0),并按原样存储下一个元素。它起作用next ^ 0 = next