链表有两个重要的东西,一个是数据域,另一个是指针域。但是我们用结构体加指针的方式我们每次都要动态申请空间,而C++中的new函数实现非常的耗时,所以我们当有许多组数据的时候,我们通常采用数组模拟的方式来存储链表。
数组中的下标表示的是结点,e[N]表示的是当前结点里面存储的值,即数据域,ne[N]表示的是当前结点指向下一个节点的位置,即指针域。我们要实现还需要一个int类型的变量head,head表示头节点的下标,idx是一个指针,idx表示当前已经用到了哪个点(当我们在声明数组大小的时候有N个点,首先idx指向的是第一个点,当我们要给新的一个点分配空间的时候,然后idx指针就接着往后面移动一位。)
下面来谈一谈一些基本的操作:
1:初始化链表
const int N=1e+5+10;
int head,e[N],ne[N],idx;
void init(){
head=-1;//初始的时候链表是空的,头结点指向的是空集
idx=0;//初始的时候idx是从0开始的
}
2:如何在链表里面插入一个点
(1)将一个数插入到头结点
思路:1:将这个结点的指针指向head结点所指向结点的位置;
2:将head结点所指向结点的位置删除,然后head结点指向这个结点。
void add_to_head(int x){
e[idx]=x;//将x存到当前结点里面
ne[inx]=head;//将当前节点的指针指向head结点
head=idx;//head指针指向idx
idx++;
}
(2)将一个数插入到链表的任意一个位置(除了头结点)
思路:1:将这个结点的指针指向插入到链表中第k个结点所指向结点的位置;
2:将第k个结点所指向结点的位置删除,然后第k个结点指向这个结点。
void add(int k,int x){
//k表示我要将这个结点插入到链表的第几个节点的后面,x表示要插入结点的值
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx;
idx++;
}
3:如何删除链表中的一个元素
将下表为k的结点的后面一个结点删掉
void remove(int k){
ne[k]=ne[ne[k]];
}