题目:利用一个指针实现双链表。每一个节点里面存一个np,x.np = x.pre XOR x.next
思路: a XOR a = 0; 0 XOR a = a; 因此,np与父节点进行xor运算之后,就能得到next的地址。
#include <iostream>
using namespace std;
struct LinkList{
int key;
int prenext;
};
struct LinkList* insertLinkList(struct LinkList*head,int d,struct LinkList**tail);
struct LinkList* searchLinkList(struct LinkList*head,int d);
struct LinkList* deleteLinkList(struct LinkList*head,int d);
void print(struct LinkList* head);
int main ()
{
struct LinkList*head = 0;
struct LinkList*tail = 0;
for (int i = 0;i < 12;i ++)
{
head = insertLinkList(head,i,&tail);
//cout << tail->key;
}
print(head);
print(tail);
struct LinkList* tr = searchLinkList(head,12);
if (tr)
{
cout << tr-> key << endl;
}
}
struct LinkList* insertLinkList(struct LinkList*head,int d,struct LinkList**tail)
{
struct LinkList * tmp = new struct LinkList();
tmp->key = d;
tmp->prenext = 0;
if (NULL == head)
{
head = tmp;
head->prenext = 0;
*tail = tmp;
return head;
}
if ( 0 == head->prenext)
{
head->prenext = (int)tmp;
tmp->prenext = tmp->prenext^((int)head);
*tail = tmp;
return head;
}
struct LinkList * p = head;
struct LinkList * q = (struct LinkList *)head->prenext;
struct LinkList * r = NULL;
struct LinkList * s = NULL;
while (q != 0)
{
r = q;
s = p;
q = (struct LinkList*)(q->prenext^((int)p));
p = r;
r = s;
}
p->prenext = ((int)tmp)^((int)r);
tmp->prenext = ((int)p);
*tail = tmp;
return head;
}
void print(struct LinkList* head)
{
if (NULL == head)
{
return ;
}
struct LinkList * p = head;
cout << p->key << ' ';
struct LinkList * q = (struct LinkList *)head->prenext;
if (NULL == q)
{
return;
}
struct LinkList * r = NULL;
struct LinkList * s = NULL;
while (q != NULL)
{
r = (struct LinkList *)(q->prenext^((int)p));
cout << q->key << ' ';
p = q;
q = r;
}
cout << endl;
}
struct LinkList* searchLinkList(struct LinkList*head,int d)
{
if (NULL == head)
{
return 0;
}
struct LinkList * p = head;
if (p->key == d)
{
return p;
}
// cout << p->key << ' ';
struct LinkList * q = (struct LinkList *)head->prenext;
if (NULL == q)
{
return 0;
}
struct LinkList * r = NULL;
struct LinkList * s = NULL;
while (q != NULL)
{
r = (struct LinkList *)(q->prenext^((int)p));
if (q->key == d)
{
s = q;
break;
}
//cout << q->key << ' ';
p = q;
q = r;
}
return s;
// cout << endl;
}
struct LinkList* deleteLinkList(struct LinkList*head,int d)
{
}