在 Cormen 的作者之一的书中,异或链表存在一个有趣的问题。
我举了一个将项目添加到异或链表的例子。
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
在此)。乍一看,似乎当pCurrent <====> pNew <====> pNext <====> (NextNode to pNext)
pCurrent 与pNext-> ptrdiff
.