异或链表,时间换空间思想的应用,一种双向链表的实现方式,在链表节点地址域中只有前后节点地址的异或值,计算下一个节点时,可以用上一节点的地址和当前节点的地址域中的值进行异或操作,即可获取下一节点的地址值。
#include <iostream>
// XOR Node
class XORNode {
public:
int data;
XORNode *xor_with_next;
XORNode(int value, XORNode * xor_val) : data(value), xor_with_next(xor_val) {}
XORNode(){
}
};
// XOR Linked List
class XORLinkedList {
private:
XORNode* head;
XORNode* tail;
public:
XORLinkedList(){
head =new XORNode();
head->data=0;
tail = new XORNode();
tail->data=0;
tail->xor_with_next = head;
head->xor_with_next = tail;
}
// 添加新节点
void append(int value) {
std::cout<<"inset "<<value<<std::endl;
if(head->xor_with_next==tail){
XORNode* newNode = new XORNode(value, (XORNode *)(((unsigned long long)head)^((unsigned long long)tail)));
head->xor_with_next=(XORNode *)(((unsigned long long)newNode^(unsigned long long)tail));
tail->xor_with_next=(XORNode *)(((unsigned long long)newNode^(unsigned long long)head));
}else{
XORNode* prev = (XORNode *)((unsigned long long)tail->xor_with_next^(unsigned long long)head);
std::cout<<"prev->data: "<<prev->data<<std::endl;
XORNode* newNode = new XORNode(value, (XORNode *)(((unsigned long long)prev)^((unsigned long long)tail)));
XORNode* pprev = (XORNode *)((unsigned long long)prev->xor_with_next^(unsigned long long)tail);
std::cout<<"pprev->data: "<<pprev->data<<std::endl;
prev->xor_with_next = (XORNode *)(((unsigned long long)pprev)^((unsigned long long)newNode));
tail->xor_with_next=(XORNode *)(((unsigned long long)newNode)^((unsigned long long)head));
}
}
// 查找节点
XORNode* find(int target) {
if(head->xor_with_next==tail){
return NULL;
}
XORNode* current = (XORNode *)(((unsigned long long)head->xor_with_next)^((unsigned long long)tail));
XORNode* prev=head;
while (current != tail) {
std::cout<<"current->data:"<<current->data<<std::endl;
if (current->data == target) {
return current;
} else {
XORNode* temp=current;
current=(XORNode *)(((unsigned long long)current->xor_with_next)^((unsigned long long)prev));
prev=temp;
}
}
return NULL;
}
// 释放内存
~XORLinkedList() {
XORNode* next = NULL;
while (head) {
XORNode* temp = head;
// head = head->xor_with_next;
delete temp;
}
}
};
int main() {
XORLinkedList list;
list.append(1);
list.append(2);
list.append(3);list.append(4);
XORNode* node = list.find(6);
std::cout<<"search ending"<<std::endl;
if (node) {
std::cout << "Found node with value " << node->data << std::endl;
} else {
std::cout << "Node not found" << std::endl;
}
return 0;
}