单链表
在初阶数据结构讲过,如果数据范围很大,每次都要new结点就会很慢,所以用数组来模拟,常常用于邻接表(后面说)
用数组模拟所要用到的:
int e[N];//存结点的值
int ne[N];//存当前结点的下一个结点(相当于next指针)
int head;//表示头结点的下标
int index;//存储当前已经用到的结点
如图所示:
初始化
刚开始链表为空,head等于-1,index等于0
void init()
{
head = -1;
idex = 0;
}
头插
代码如下:
//头插
void add_to_head(int x)
{
e[idex] = x,ne[idex] = head, head = idex++;
}
在下标为k的结点后插入x
代码如下;
//将x插到k的后面
void add(int k,int x)
{
e[idex] = x;
ne[idex] = ne[k];
ne[k] = idex++;
}
删除k的后一结点
代码如下:
//删除k的后面的点
void del(int k)
{
ne[k] = ne[ne[k]];
}
头删
例题实战
题目链接点击直达
#include<iostream>
using namespace std;
const int N = 1000010;
int e[N],ne[N];
int idex,m,head;
void init()
{
head = -1;
idex = 0;
}
//头插
void add_to_head(int x)
{
e[idex] = x,ne[idex] = head, head = idex++;
}
//将x插到k的后面
void add(int k,int x)
{
e[idex] = x;
ne[idex] = ne[k];
ne[k] = idex++;
}
//删除k的后面的点
void del(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
cin>>m;
init();
while(m--)
{
char ch;
int k,x;
cin>>ch;
if(ch == 'H')
{
cin>>x;
add_to_head(x);
}
else if(ch == 'D')
{
cin>>k;
if(!k) head = ne[head]; //注意k=0就是头删
else del(k-1); //下标是从0开始的
//删除第k个插入的,第一个插入的下标是0,所以k要减1
}
else
{
cin>>k>>x;
add(k-1,x);
}
}
//输出链表
for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';
cout << endl;
return 0;
}