在一本作者是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]

09-27 09:19