作用:
数组模拟单/双链表在算法竞赛中运用广泛,可用于存储图和树,用单链表记录所有可到达的结点,相比于传统链表速度更快,内存泄漏问题竞赛中一般无需考虑。
数组模拟单链表:
int head , e[N] , ne[N] , idx;
// head存储链表头指针
// e[i] 记录该结点的值
// ne[i] 记录该结点的next指针
代码模板:
#include <iostream>
using namespace std;
int head , e[N] , ne[N] ,idx;
//初始化
void init(){
head = -1;
idx = 0;
}
//插入头结点
void add_to_head(int x){
e[idx] = x;
ne[idx] = head;
head = idx;
++idx;
}
//在k后插入结点
void add(int k, int x){
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
++idx;
}
//删除头结点
void remove(){
head = ne[head];
}
//删除k后面的结点
void remove(int k){
ne[k] = ne[ne[k]];
}
//遍历链表
for(int i = head; i != -1; i = ne[i]){
cout << e[i] << ' ';
}
数组模拟双链表
int e[N],r[N],l[N],idx;
// e[i] 记录该结点的值
// r[i] 记录该结点的右指针
// l[i] 记录该结点的左指针
int e[N],r[N],l[N],idx;
//初始化
void init(){
l[1] = 0; //模拟head
r[0] = 1; //模拟tail
idx = 2; //head与tail占用
}
//在k右边插入值为x的结点
void add(int k, int x){
e[idx] = x; //记录x
r[idx] = r[k]; //将idx的右结点设置为k的右结点
l[idx] = k; //将idx的做结点设置为k
l[r[k]] = idx; // 将原先k的右结点的左结点设置为idx
r[k] = idx; //最后将k的右结点设置为idx
++idx;
}
//将k结点删除
void remove(int k){
r[l[k]] = r[k]; //将k左结点的右结点设置为k的右结点
l[r[k]] = l[k]; //将k右结点的左结点设置为k的左结点
}
//遍历双向链表
for(int i = r[0]; i != 1; i = r[i]){
cout << e[i] << ' ';
}
感谢各位观看,欢迎交流~~~