一般链表都是动态的,需要指针来建立结点之间的连接关系。不过一些结点的地址是比较小的整数,这样就没有必要去建立动态链表,可以使用静态链表去建立结点之间的关系

静态链表的原理是hash,建立一个结点结构体数组,数组的下标直接表示结点的地址,可以通过下标(结点的地址)来达到直接访问的效果,同时静态链表是不需要给出头节点的,只需给出某个结点的地址,就可以实现部分(或全部)遍历

const int MAXN = 100010;
struct Node {
	int key;
	int next;  //指向下一个结点的地址
}nodes[MAXN];

next用来存放下一个结点的地址:比如我们给出一串数字11111,22222,33333分别代表链表中3个结点的地址

node[11111]=22222;
node[22222]=33333;
node[33333]=-1; //-1表示NULL

应用:

有的时候题目会给出一些结点以及他的地址和他的next地址,需要我们筛选出链表中的结点(链表外的结点为无效结点)

并对这些结点进行操作,解决步骤模板如下:

1.建立结点结构体和数组

const int MAXN = 100010;
struct Node {
	int key;
	int next;  //指向下一个结点的地址
    int valid;  //结点是否为有效结点
}nodes[MAXN];

2.对链表进行初始化,将所有结点设置为无效结点

for (int i = 0; i < MAXN; ++i) {
		nodes[i].validation = -1;  //先全部设置为无效结点
}

3.根据题目中的测试用例,筛选出有效结点

int p1 = headAddr;
	while (p1 != -1) {
		counter++;
		nodes[p1].validation = 1;
		p1 = nodes[p1].next;  
	}

4.编写排序函数,将有效结点集中在数组左边,无效结点集中在链表右边

bool cmp(Node a, Node b) {
	if (a.validation == -1 || b.validation == -1) {
		return a.validation > b.validation;  //将有效结点左移
	}
	else {
		//二级排序,根据题目编写即可
	}
}