我们在比赛或者考试的时候,可能会遇到有关于链表的题
可是我们如果用new函数来制出一个节点的时候,他是非常慢的,会极大影响我们的运行速度。
这时我们可以使用数组来模拟链表,这样会快很多。
接下来看一道来自acwing的例题(www.acwing.com)
下面为一个简单的链表
这里我们设置几个变量:
e[i] 表示第i个节点的值
ne[i] 表示节点i的next指针是多少
head 表示头节点
除了以上的这些我们还要设置一个新的参数:idx:它表示的是当前已经进行到第几个节点
首先看第一个操作,在头结点插入一个节点
- 将要插入的值存入
- 将head存入ne中
- 将头结点设成当前位置
- 再让x继续往后
用图片来表示就是这样:
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx++;
}
第二个操作:删除第k个数后面的一个数
我们的思路是直接让他跳过这个数,直接去链接后面的数
void remove(int k)
{
ne[k] = ne[ne[k]];
}
第三个操作:在第k个数的后面插入一个数
这个操作和第一个操作的过程差不多,不过是把head改成相应的下标
void add(int k,int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
下面是完整的代码
#include <iostream>
using namespace std;
const int N = 1e6+10;
//head 表示头结点的下标
//e[i] 表示节点i的值
//ne[i] 表示节点i的next指针是多少
//idx 表示当前已经用到了哪个节点
int head ,e[N],ne[N],idx;
//初始化
void init ()
{
head = -1;
idx = 0;
}
//在头结点插入一个点
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx++;
}
//在k后插入一个点
void add(int k,int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx++;
}
void remove (int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
int m;
cin>>m;
init();
while(m--)
{
int k,x;
char c;
cin>>c;
if(c=='H') cin>>x,add_to_head(x);
else if(c=='I') cin>>k>>x,add(k-1,x);
else
{
cin>>k;
if(!k) head = ne[head];
else remove(k-1);
}
}
for(int i = head;i!=-1;i=ne[i]) cout<<e[i]<<' ';
cout<<endl;
return 0;
}