【寒江雪】利用异或性质实现双向链表
来源:互联网 发布:淘宝天猫详情页尺寸 编辑:程序博客网 时间:2024/05/16 18:23
保存地址的思路:
利用异或的性质,a^b=p
b^p=a
a^p=b
因此
只要知道后继节点的地址,就可以得到前驱节点的地址
只要知道前驱节点的地址,就可以得到后继节点的地址
#include<iostream>
template<class Type>
struct Node
{
long long np;
Type Item;
};
template<class Type>
class List
{
private:
Node<Type> nil;
int size;
Node<Type> *tail;
public:
List();
Node<Type> *Search(const Type &Item);
bool Insert(const Type &Item);
bool Delete(const Type &Item);
};
template<class Type>
List<Type>::List()
:size(0)
{
nil.Item = NULL;
nil.np = NULL^NULL;
tail = &nil;
}
template<class Type>
Node<Type>* List<Type>::Search(const Type&Item) {
Node<Type>* prev = NULL;
Node<Type>* now = &nil;
Node<Type>* temp;
while ((now!=NULL) && now->Item != Item) {
temp = now;
now =(Node<Type>*)(now->np^(long long)prev);//下一个节点
prev = temp;
}
return now;
}
template<class Type>
bool List<Type>::Insert(const Type &item) {
Node<Type>* newNode = new Node<Type>;
Node<Type>* prev;//尾端的前驱节点
newNode->Item = item;
newNode->np = (long long)tail^NULL;//前 异或 后
prev =(Node<Type>*)( NULL^(long long)tail->np);
tail->np = (long long)prev^(long long)newNode;
tail = newNode;
size++;
return true;
}
template<class Type>
bool List<Type>::Delete(const Type &item) {
//Copy From Search
Node<Type>* prev = NULL;
Node<Type>* now = &nil;
Node<Type>* temp ;
while ((now != NULL) && (now->Item != item)) {
temp = now;
now = (Node<Type>*)(now->np ^ (long long)prev);
prev = temp;
}
Node<Type>* prev_prev;
Node<Type>* next_next;
Node<Type>* next;
if (now == NULL)
return false;
prev_prev = (Node<Type>*)((long long)now ^ prev->np);
if (now == tail){
prev->np = (long long)prev_prev^NULL;
}
else {
next = (Node<Type>*)(now ->np ^ (long long)prev);
next_next = (Node<Type>*)(next->np ^ (long long)now );
prev->np = (long long)prev_prev ^ (long long)next;
next->np = (long long)prev ^ (long long)next_next;
}
delete now;
size--;
return true;
// if(now==tail)
}
0 0
- 【寒江雪】利用异或性质实现双向链表
- 异或双向链表
- 利用双向链表实现约瑟夫问题
- 利用双向链表实现LinkedList
- 滴滴笔试题,异或性质的利用
- 异或形式的双向链表
- 异或的性质
- 用异或的性质实现简单加密解密
- Linux利用list_head结构实现双向链表
- Linux利用list_head结构实现双向链表
- Linux利用list_head结构实现双向链表
- 利用 双向循环链表 实现通讯录的功能
- Linux利用list_head结构实现双向链表
- 异或的性质&应用
- 异或运算的性质
- 异或运算的性质
- POJ 1703 Find them, Catch them (并查集&利用异或的性质优化)
- 实现双向链表
- 二叉寻找数的实现
- WebView详解与简单实现Android与H5互调
- leetcode 412. Fizz Buzz
- LeetCode No.82 Remove Duplicates from Sorted List II
- POJ刷题顺序
- 【寒江雪】利用异或性质实现双向链表
- masterJ2SE篇010——OutOfMemoryError
- matlab和C/C++混合编程--Mex
- CSDN-markdown编辑器教程
- 一款好用的编辑器-markdown
- HDU 3507:Print Article(斜率DP)
- Unity 3D-新版AssetBundle(API介绍&基本分析)
- 由先序+后序遍历确定序列是否唯一并输出一个中序序列
- 【寒江雪】优先队列