在我之前的blog中,我发布了一个用结构体实现单链表的实现方式。但是我发现,在做题的时候,很容易TLE(超时)。所以我又打算发一下用数组实现单链表的版本
值得注意的是,用数组实现单链表的操作,运行的时间比结构体实现的方式快,这里并不是说结构体不好,他们各自有各自的好处。
接下来,我来给你们尽可能详细的讲述一下数组实现单链表的方式。
//用数组模拟单链表
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int e[N], ne[N], idx, head;
//e[N]表示结点里面的值
// //ne[N]表示指向下一结点的位置
// idx表示指向当前结点的位置
//初始化链表
void init()
{
head = -1;//使头结点指向空值(可以用任意负数代替)
idx = 0;//idx表示(伪)指针
}
//在头结点后面插入一个值
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
void add(int k, int x)//将x插到下标是k的点后面
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
void remove(int k)//将下标为k后面的一个结点删掉
{
ne[k] = ne[ne[k]];
}
再附上关于单链表基础操作的完整代码:
//示例:
//易错点:容易忽略初始化
//worse:未实现链表删除
#include<iostream>
using namespace std;
const int N = 10010;
int e[N], ne[N], idx, head;
//e[]:结点里面的值
//ne[]:指向下一结点
//idx:当前结点的位置
void init()
{
head = -1;
idx = 0;
}
void add_to_head(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
void add(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
void remove(int k)
{
ne[k] = ne[ne[k]];
}
int main()
{
init();
cout << "你正在使用数组模拟单链表操作!";
cout << endl;
int n;
cout << "你将要往单链表中插入的元素个数:";
cin >> n;
int x;
cin >> x;
add_to_head(x);
for (int i = 0; i < n-1; i++)
{
cin >> x;
add(i, x);
}
cout << endl;
cout << "你所搭建单链表中的元素:" << endl;
for (int i = 0; i < n; i++) cout << e[i] << " ";
cout << endl;
cout << "输入你想删除的结点:" <<endl;
cin >> x;
remove(x-2);//remove是指,删除当前结点的下一个结点
cout << "输出删除结点2后的单链表:" << endl;
for (int i = head;i != -1;i=ne[i]) cout << e[i] << " ";
}