在使用结构体实现链表时,我们要用到new来开辟内存,由于new的底层涉及内存分配,调用构造函数,指针转换等多种复杂且费时的操作。一秒大概能new1w次左右。在平时的工程代码中,不会涉及上万次的new操作,所以这种结构是一种 见代码知意 的好结构。但是在算法比赛中,经常碰到操作在10w级别的链表操作,如果使用结构体这种操作,是无法在算法规定时间完成的。所以,在算法比赛这种有严格的时间要求的环境中,不能频繁使用new操作。也就不能使用结构体来实现数组,因此我们只能用数组来模拟静态链表。
#include<iostream>
using namespace std;
int e[N], ne[N]; //e为数据域,ne为指针域
int head = -1, idx = 0;// idx表示当前已经插入的个数,head是链表头结点下标,
// e数组存储链表结点的值,ne存储某个下标结点的next指针(下标)
// 比如ne[1] = 2表示下标为1的结点的next指向下标为2的结点
void to_head(int x) //头插
{
e[idx] = x; ne[idx] = head; head = idx++;
}
void insert(int k, int x) //在第k个插入的数后面插入x
{
e[idx] = x; ne[idx] = ne[k]; ne[k] = idx++;
}
void remove(int k) //删除第k个插入的数后面一个数
{
ne[k] = ne[ne[k]];
}
void print()
{
for(int i = head ; i != -1 ; i = ne[i])
cout << e[i] << " "; //链表的遍历
}
int main()
{
to_head();
insert();
Print();
remove();
return 0;
}