目录
1.引言
为什么要用数组来模拟实现单链表?因为链表的实现(new)是一个十分慢的过程,因此,我们在算法题中常用数组来模拟实现链表,栈,队列等数据结构,以空间换时间,提高程序运行的速率。
2.思路介绍
我们知道一般链表的思路是这样的
需要用到的是一个变量存数据,一个变量存地址。
那仔细思考一下,我们是不是也可以用两组数组来实现这个结构呢!
int e[N]; 存放值
int ne[N]; 存放下标
通过数组ne来找到e中每个值对应的下标,是不是就有了一个一一对应的关系?
那又有一个新问题出现,如何实现插入,删除等操作呢???
3.代码实现
结合一道题目来解释
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
//ne[]存放下标,模拟next指针
int e[N],ne[N];
//idx模拟为创建的结点,idx的值为对应结点的下标,以及虚拟创建的结点个数。
int idx = 1;
//ne[0]模拟头指针
//插入结点模拟
void insert_back(int k,int x)
{
e[idx]=x,ne[idx]=ne[k],ne[k]=idx++;
//1.先存入插入的值
//2.同时新结点存储下一个结点对应的下标
//3.修改新结点的上一个结点 存储新结点的下标
//4.idx++以便下一次存储新节点的值与指向结点的下标
}
//删除结点模拟
void dele_back(int k)
{
//ne[k]意为第k个结点指向的下一个结点的下标
//将第k个结点储存的下标跳过那个要删的结点指向其后第二位的结点
//比如0->1->2,数组ne中ne[k]=1,ne[ne[k]]=2
ne[k]=ne[ne[k]];
}
int main()
{
int M;
scanf("%d",&M);
while(M--)
{
char input;
int k,x;
scanf("\n%c",&input);
switch(input)
{
case 'H':
scanf("%d",&x);
insert_back(0,x);
break;
case 'D':
scanf("%d",&k);
dele_back(k);
break;
case 'I':
scanf("%d%d",&k,&x);
insert_back(k,x);
break;
}
}
for(int j = ne[0];j;j=ne[j])
{
printf("%d ",e[j]);
}
return 0;
}
请结合代码,手动画图来理解具体的思想,这样会很快明白!!!
3.结语
数据模拟实现单链表的内容已经结束了,主要是当做一个算法模板,以便写题时快速上手使用。
同时也能加深对链表的理解。