说明如何在每个元素仅使用一个指针 x.np(而不是通常的两个指针 next 和 prev)的情况下实现双向链表。假设所有指针的值都可视为k位的整型数,且定义 x.np = x.next XOR x.prev,即 x.next 和 x.prev 的k位异或。(NIL的值用0表示。)注意要说明获取表头所需的信息,并说明如何在该表上实现SEARCH、INSERT和DELETE操作,以及如何在O(1)时间内实现该表的逆转。
主要是在原答案的基础上加了些注释。。。
基于A = C XOR (A XOR C)
SEARCH(L, k)
p = L.head
x = L.head.np
while x != NIL and x.key != k do # 循环直到链表尾,或找到查询元素
temp = x # temp寄存当前元素
x = (p XOR x.np) # p是上一个元素,于是 p XOR x.np 是x的下一个元素,将其赋予x
p = temp # 更新p为寄存的未更新时的x,即现在x的上一个元素
end while # 结束循环
return x # 返回x,为找到的元素(非0)或未找到(0)
INSERT(L, x)
x.np = L.head # x指向L.head
L.head.np = x XOR L.head.np # L.head指向x和x1
L.head, x = x, L.head # L.head、x易位
DELETE(L, k)
p = L.head
x = L.head.np
while x != NIL and x.key != k do
temp = x
x = p XOR x.np
p = temp
end while
# p为x上一个元素,x为找到的元素
# p.np →(p之前一个元素,x)
# x.np XOR p = x的下一个元素
p.np = p.np XOR (x XOR (x.np XOR p))
(x.np XOR p).np = p XOR (x XOR (x.np XOR p).np)
REVERSE(L)
L.head, L.nil = L.nil, L.head
还是感觉做的有问题。。。