思路:按提示是将指针转换为整型数,然后做异或保存为np。我们知道对于异或操作来说,如果c = a ^ b,那么c ^ a = b且 c ^ b = a。也就是说对于异或的结果,可以根据其中一个原操作数解出另一个原操作数,单独给出一个异或结果值是无法用于计算的。所以在构造链表时可以先构造出第一个结点,并获得其指针,然后用这个指针去构造第二个结点,在构造新结点时它的prev值为NULL(0),next值为上一个结点的指针,所以可以在O(1)的时间复杂度内构造出链表。另外,在遍历这个链表时无法知道是原结点prev还是next。delete操作可以采用按关键字的方法,也就是先遍历再删除。
代码:
#include <iostream>
struct Node
{
int key;
unsigned long np;
Node(int x) : key(x), np(0) {}
};
Node *insert(Node *head, int key)
{
Node *t = new Node(key);
if (NULL != head)
{
t->np = reinterpret_cast<unsigned long>(head);
head->np ^= reinterpret_cast<unsigned long>(t);
}
return t;
}
void printList(Node *head)
{
unsigned long prev = 0;
while (head)
{
std::cout << head->key << " <==> ";
unsigned long t = reinterpret_cast<unsigned long>(head);
head = reinterpret_cast<Node*>(head->np ^ prev);
prev = t;
}
std::cout << "NULL\n";
}
int main()
{
Node *head, *tail;
head = tail = insert(NULL, 0);
for (int i = 1; i < 5; ++i)
head = insert(head, i);
printList(head);
printList(tail);
return 0;
}