十六.用数组模拟链表
如果用结构体和指针来实现链表,效率其实不如用数组,笔试题中很容易超时。
1.单链表
在笔试中用的最多的是邻接表。
邻接表的运用是存储图和树。
用数组来模拟,首先定义一个数组存储链表表示值的部分。可定义为value[N]或者e[N],用另一个数组表示指向下一个节点的指针可记为ne[N]。e和ne用下标关联起来。ne里面存的也是下标。如果下一个不存在则存-1
#include<iostream>
using namespace std;
const int N=100010;
//head表示头结点的下标
//e[i]表示节点i的值
//ne[i]表示节点i的next指针是多少
//idx存储当前已经用到了哪个点。如果要开新点,应该把inx指向的点赋值然后idx向后移一位
//初始化
void init(){
head=-1;
idx=0;
}
//将x插入到头节点
void add_to_head(int x){
//先把要插入的节点的ne指向head的ne指向的节点,然后将head的ne指向该加入的节点
e[idx]=x,ne[idx]=head,head=idx,idx++;
}
//一般操作,将x插到下标是k的点的后面
void add(int x,int k){
e[idx]=x,ne[idx]=ne[k],ne[k]=idx,idx++;
}
//将下标是k的点的后面那个点删掉
void remove(int k){
ne[k]=ne[ne[k]];
}
2.双链表
多用来优化某些问题。
跟单链表类似,不过他有两个指针,一个指向上一个节点,一个指向下一个。所以用l[N]和r[N]分别来储存。