单链表:
#include<iostream>
using namespace std;
const int N=1e5+10;
// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next 指针是多少
// idx 存储当前已经用到了哪个点
int head,e[N],ne[N],idx;
//初始化
void init()
{
head=-1;
idx=1;
}
// 将x插到头结点
void add_to_head(int x)
{
e[idx]=x;
ne[idx]=head;
head=idx;
idx++;
}
// 将x插入到下标是k的点后面
void add(int k,int x)
{
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
// 将下标是k的点后面的点删掉
void remove(int k)
{
ne[k]=ne[ne[k]];
}
// 遍历链表
void ergodic()
{
for(int i=head; i!=-1; i=ne[i])
cout<<e[i]<<" ";
cout<<endl;
}
int main()
{
init();// 初始化
add_to_head(1);
add_to_head(2);
add_to_head(3);
add(3,6);
remove(2);
ergodic();
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------
双链表:
#include<iostream>
using namespace std;
const int N=1e5+10;
int e[N],r[N],l[N],idx;
//初始化
void init()
{
//0表示左端点,1表示右端点
r[0]=1,l[1]=0;
idx=2;
}
// 在下标是k的点右边,插入x ( 如果在k的左边插入:add(l[k],x) )
void add(int k,int x)
{
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[k]]=idx;
r[k]=idx;
idx++;
}
// 删除第 K个点
void remove(int k)
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}