为什么要使用数组模拟链表?
链表常在面试中被问到。
但是在笔试题中,由于数据的规模在1w~10w级别,每次new一个Node速度很慢,导致程序无法在1s内跑完。用数组模拟链表,可以解决程序运行速度的问题。(用空间换时间)
链表的类型:
- 单链表:用于创建邻接表(常在树与图的问题中出现);
- 双链表:用于优化某些问题。
单链表
一般结构体形式的单链表定义:
struct Node{
int value;
Node* next;
};
数组模拟的思想:
以下标index为指针,使用两个数组对分别记录单链表中value的值以及next指向的下一个结点的下标。
【补图】
数组模拟的单链表定义:
const int N=1e5+10;
int val[N],ne[N],head,idx;
- head:表示头结点的下标;(设立头结点方便对头结点的插入删除)
- val[i]:表示节点i的值;
- ne[i]:表示节点i的next指针是多少;
- idx:表示存储当前已经用到了哪个点。
对单链表初始化:
void init(){
head=-1; //一开始头结点为空,用-1表示
idx=1; //可以从下标0或下标1开始,根据实际情况而定
}