1.我们先创建两个数组,一个用来存储当前结点的值,一个用来存储下一个结点的位置。(为了方便,将数组开在全局当中)
#define N (int)1e5+5
int e[N],ne[N];
2. 创建两个变量,一个用来存储头结点的位置(head),一个用来记录当前用到数组的哪个下标(index)并完成初始化。
int head = -1,index = 0;
开始写有关链表的操作。
(1)将一个值插入到头结点
void add_head()
{
e[index] = x;//在当前位置保存该值
ne[index] = head;//指向之前的头结点
head = index;//变更头结点
index++;//下标后移
}
(2)将一个值插入到下标为id的后面
void add_to(int id, int x)
{
e[index] = x;
ne[index] = ne[id];//让新节点指向id指向的结点
ne[id] = index;//id指向新节点
index++;//下标后移
}
(3)将下标为id 后面的一个点删除
void remove_to()
{
ne[id] = ne[ne[id]];
}
(4)删除头结点
void remove_head()
{
head = ne[head];
}
来看道题:
输入样例:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
输出样例:
6 4 6 5
代码:
#include <stdio.h>
#define N (int)1e5+5
//e[N]存储值,ne存储下一个值的位置,index是当前数组的下标,head是头结点的下标
int e[N],ne[N],index = 0,head = -1;//赋值时已初始化
void add_head(int x)//将x插入到头结点
{
e[index] = x;
ne[index] = head;
head = index;
index++;
}
void add_to(int id,int x)//在下标为id的后面插入x
{
e[index] = x;
ne[index] = ne[id];
ne[id] = index;
index++;
}
void remove_to(int id)//将下标为id后面的值删除
{
ne[id] = ne[ne[id]];
}
void remove_head()//删除头结点
{
head = ne[head];
}
int main()
{
int m = 0;
scanf("%d",&m);
getchar();
while(m--)
{
char op = 'a';
int k = 0,x = 0;
scanf("%c",&op);
if(op=='H')
{
scanf("%d",&x);
getchar();
add_head(x);
}
else if(op=='D')
{
scanf("%d",&k);
getchar();
if(k) remove_to(k-1);
else remove_head();
}
else
{
scanf("%d%d",&k,&x);
getchar();
add_to(k-1,x);
}
}
for(int i = head;i!=-1;i = ne[i])
{
printf("%d ",e[i]);
}
return 0;
}