在一本作者是Cormen的书中,有一个有趣的问题是XOR链表。
我举了一个向xor链表添加项的例子。
void insertAfter(plistNode pNew, T theElm)
{
plistNode pPrev, pCurrent, pNext;
pPrev = NULL;
pCurrent = pStart;
while (pCurrent) {
pNext = NextNode(pCurrent, pPrev);
if (pCurrent->elm == theElm) {
/* traversal is done */
if (pNext) {
/* fix the existing next node */
pNext->ptrdiff =
(plistNode) ((int) pNext->ptrdiff
^ (int) pCurrent
^ (int) pNew);
/* fix the current node */
pCurrent->ptrdiff =
(plistNode) ((int) pNew ^ (int) pNext
^ (int) pCurrent->ptrdiff);
/* fix the new node */
pNew->ptrdiff =
(plistNode) ((int) pCurrent
^ (int) pNext);
break;
}
pPrev = pCurrent;
pCurrent = pNext;
}
}
我不明白这个密码
pNext-> ptrdiff = (plistNode) ((int) pNext-> ptrdiff
^ (Int) pCurrent
^ (Int) pNew);
在我看来
pNext-> ptrdiff = New Xor pNext[next]
谢谢你的回答。对不起,我的问题很傻,为什么在第一行使用
pNext-> ptrdiff
(这里是pNext->ptrdiff = pNext->ptrdiff XOR pCurrent XOR pNew
)乍一看,当电流与电流无关时。 最佳答案
用于a的异或链表逻辑
B应该包含一个异或C
现在,
1>之前:
Pcurrentpnext(下一个pnext节点)
所以,
pnext->ptrdiff=p当前异或(pnext的下一个节点)
2>在电流后插入PNEW后,应具有:
pCurrentpNewpNext(NextNode到pNext)
所以,pnext->ptrdiff应该是
pnext->ptrdiff=pnew异或(pnext的下一个节点)
所以代码是通过
pNext->ptrdiff = pNext->ptrdiff XOR pCurrent XOR pNew
= pCurrent XOR (NextNode to pNext) XOR pCurrent XOR pNew [ replaced pNext->ptrdiff from 1 ]
= pCurrent XOR pCurrent XOR (NextNode to pNext) XOR pNew [ XOR is commutative ]
= 0 XOR (NextNode to pNext) XOR pNew [ A XOR A = NULL ]
= (NextNode to pNext) XOR pNew [ 0 XOR A = A ]
这是预期的[从2]