链表是一种很常见的数据结构
接下来,给大家看链表中的单链表
其中有三种操作
H x
,表示向链表头插入一个数 xD k
,表示删除第 k 个插入的数后面的数(当 k为 0 时,表示删除头结点)I k x
,表示在第 k个插入的数后面插入一个数 x(此操作中 k 均大于 0)
#include<iostream>
using namespace std;
const int N=100100;
int idx=1,ne[N],e[N],head=-1;
void add(int k,int x)
{
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
void add_to_head(int x)
{
e[idx]=x;
ne[idx]=head;
head=idx;
idx++;
}
void remove(int k)
{
ne[k]=ne[ne[k]];
}
int main()
{
int n,k,x;
cin>>n;
while(n--)
{
char opt;
cin>>opt;
if(opt=='H')
{
cin>>k;
add_to_head(k);
}
if(opt=='D')
{
cin>>k;
if(k==0)
{
head=ne[head];
}else{
remove(k);
}
}
if(opt=='I')
{
cin>>k>>x;
add(k,x);
}
}
for(int i=head;i!=-1;i=ne[i])
{
cout<<e[i]<<" ";
}
return 0;
}
其中idx用来记录第几个元素
并且要注意,进行插入和删除操作时,参数要对应上idx,而且要注意初始化,我的idx从1开始
接下来是双链表的代码
其中的五种操作分别为:
L x
,表示在链表的最左端插入数 xR x
,表示在链表的最右端插入数 xD k
,表示将第 k 个插入的数删除IL k x
,表示在第 k 个插入的数左侧插入一个数IR k x
,表示在第 k 个插入的数右侧插入一个数
#include<iostream>
using namespace std;
const int N=100010;
int idx,ne[N],pr[N],e[N];
int m,x,k;
void init()
{
ne[0]=1;
pr[1]=0;
idx=2;
}
void add(int k,int x)
{
e[idx]=x;
ne[idx]=ne[k];
pr[idx]=pr[ne[k]];
pr[ne[k]]=idx;
ne[k]=idx;
idx++;
}
void remove(int k)
{
ne[pr[k]]=ne[k];
pr[ne[k]]=pr[k];
}
int main()
{
string op;
scanf("%d",&m);
init();
while(m--)
{
cin>>op;
if(op=="L")
{
scanf("%d",&x);
add(0,x);
}
if(op=="R")
{
scanf("%d",&x);
add(pr[1],x);
}
if(op=="D")
{
scanf("%d",&k);
remove(k+1);
}
if(op=="IL")
{
scanf("%d%d",&k,&x);
add(pr[k+1],x);
}
if(op=="IR")
{
scanf("%d%d",&k,&x);
add(k+1,x);
}
}
for(int i=ne[0];i!=1;i=ne[i])
{
printf("%d ",e[i]);
}
return 0;
}
双链表与单链表的区别在于单链表只记录每个元素后面的元素,而双链表则记录每个元素前面和后面的元素
(这是本人的第一篇文章,本意在于发布一些代码为以后的竞赛做复习的准备,若有不足,敬请指正)