声明:参考自acwing
目录
1.单链表
cpp
int head,e[N],ne[N],idx;
void init(){
head=-1;
idx=0;
}
void add_head(int x){ //head有实值
e[idx]=x,ne[idx]=head,head=idx++;
}
void add(int k,int x){
e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
}
void del(int k){
ne[k]=ne[ne[k]];
}
2.双链表
cpp
int e[N],l[N],r[N],idx;
void init(){
r[0]=1,l[1]=0;
idx=2;
}
void insert(int k,int x){
e[idx]=x;
r[idx]=r[k];
r[k]=idx;
l[r[idx]]=idx;
l[idx++]=k;
}
void remove(int k){
r[l[k]]=r[k];
l[r[k]]=l[k];
}
3.数组栈与队列
cpp
int t;
int st[N];
st[++t]=k;
--t;
t==0;
int hh,tt;
int q[N];
#hh做头 tt做尾
q[tt++]=k; #尾加
++hh; #头出
tt==hh #为空
4.单调栈
cpp
#常用于找出每个数左边离它最近的比它大/小的数
int tt = 0;
for (int i = 1; i <= n; i ++ )
{
while (tt && check(st[tt], i)) tt -- ;
st[ ++ tt] = i;
}