异或链表是实现双链表的一种方法,可以降低空间复杂度,每个节点只有一个指针域,用于存放前一个节点地址和后一个节点地址的异或(如果XOR链表只有一个节点,那么这个节点的指针域便是NULL xor NULL =NULL)。
下面的代码实现来XOR链表的插入函数。该插入函数将一个值插入到链表的前端。
代码如下:
struct LNode{
int data;
LNode* pnx; // XOR of the address of prev and next node
LNode(int dat, LNode* ptr = NULL): data(dat), pnx(ptr) {}
};
LNode* XOR(LNode* add1, LNode* add2)
{ // on 64-bit machine, pointer is 64-bit. Conversion of a pointer type to
// int type, which is 32-bit, is not allowed.
return (LNode*) ( (long unsigned)add1 ) ^ ( (long unsigned)add2 );
}
void insert(LNode** headref, int data)
{
// Allocate memory for new node
LNode* newHead = new LNode(data);
/* Since new node is being inserted at the begining, npx of new node
will always be XOR of current head and NULL */
newHead->pnx = XOR(NULL, *headref);
/* If linked list is not empty, then npx of current head node will be XOR
of new node and node next to current head */
if(*headref)
{
(*headref)->pnx = OXR(newHead, XOR(NULL, (*headref)->pnx) );
}
(*headref) = newHead;
}