数组模拟单链表
https://www.acwing.com/problem/content/828/
链表的实现有许多种,可以使用struct加指针的方式实现,
但是这样的方式会使用new运算符,new运行的十分的慢
动态链表因为new的原因极其慢
而数组模拟的静态链表极其快
在面试时的数据量一般非常大,这时候new就会拖我们的后腿,故采用数组模拟链表,主要使用邻接表表示,邻接表一般用于存储图和树
在实现双链表时一般是用于优化某些问题的
使用e[N]表示val,ne[N]表示下个结点,使用下标索引,空结点为-1,
初始状态:
插入头结点:

一般插入:
删除:

对于第1个点,下标为0,此后idx++,那么第2个点下标为1,那么有第k个点,下标为k-1
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int head,idx;//头指针和数组结点指针,idx即当前已经用到了第哪个点
int e[N],ne[N];
int k,num,m;
void init()
{
head = -1;//表示不存在结点
idx=0;//从0号点开始分配
}
void add_to_head(int x)
{
e[idx]=x;//将idx点分配给新点
ne[idx]=head;//设置新点的指针
head=idx;//设置新点为头结点,头指针指向新点
idx++;//从下一个点开始分配
}
void add(int k,int x)//从1开始数,在第k个点后面加入新点,k的idx为k-1
{
e[idx]=x;//将idx分配给新点
ne[idx]=ne[k];//设置新点指针
ne[k]=idx;//设置第k个点的指针,指向新点
idx++;//从下一个点开始分配
}
void remove(int k)//从1开始数,删除第k个点,k的idx为k-1
{
ne[k]=ne[ne[k]];//设置第k个点指向它原来指向的点的指针指向的地方
//删除点后idx不用变,被删除的跳过的点可以当它不存在
}
int main()
{
cin >> m;
init();
while(m--)
{
char cmd;
cin >> cmd;
if(cmd == 'H')
{
cin >> num;
add_to_head(num);
}
else if(cmd=='I')
{
cin >> k >> num;
add(k-1,num);
}
else
{
cin >> k;
if(k==0)//特判头结点
{
head=ne[head];
}
remove(k-1);
}
}
for(int i=head;i != -1;i=ne[i]) cout << e[i] << ' ';
cout << endl;
return 0;
}

浙公网安备 33010602011771号