数据结构之双向链表(数组模拟)
const int MAXN = 100005;
int value[MAXN]; //保存链表数据
int pre[MAXN]; //指向上一个元素的指针
int ne[MAXN]; //指向下一个元素的指针
int index; //当前元素保存位置
//初始化
void init() {
//第0个表示head指针指向链表开始位置
//第1个表示tail指针指向链表尾部位置
//初始化链表未空,即首尾中间无元素
pre[1] = 0; //tail指向head
ne[0] = 1; //head指向tail
index = 2;
}
//在最左侧插入一个数;
void insert_left(int x) {
ne[index] = ne[0];
pre[index] = 0;
pre[ne[0]] = index;
ne[0] = index;
value[index++] = x;
}
// 在最右侧插入一个数;
void insert_right(int x) {
ne[index] = 1;
pre[index] = pre[1];
ne[pre[1]] = index;
pre[1] = index;
value[index++] = x;
}
//将第k个插入的数删除;
void remove(int k) {
ne[pre[k+1]] = ne[k+1];
pre[ne[k+1]] = pre[k+1];
}
//在第k个插入的数左侧插入一个数;
void insert_left(int k, int x) {
ne[index] = k + 1;
pre[index] = pre[k+1];
ne[pre[k+1]] = index;
pre[k+1] = index;
value[index++] = x;
}
//在第k个插入的数右侧插入一个数
void insert_right(int k, int x) {
pre[index] = k + 1;
ne[index] = ne[k+1];
pre[ne[k+1]] = index;
ne[k+1] = index;
value[index++] = x;
}
//正向输出(head->tail)
void print_left() {
for(int i = ne[0]; i != 1; i = ne[i]) {
cout << value[i] << ;
}
cout << endl;
}
//反向输出
void print_right() {
for(int i = pre[1]; i != 0; i = pre[i]) {
cout << value[i] << ;
}
cout << endl;
}
下一篇:
试题 算法训练 无聊的逗
