【C++】Day13 数组实现单链表 Acwing.826 单链表
前言: 你好!我是Cpt,一位大一双非本科学生,C++方向,目前备战蓝桥杯,欢迎一起学习交流~
1、题目
链接.
2、思路
为什么不用结构体实现单链表?
因为在竞赛的时候如果使用结构体来写单链表,通常都会超时,比较new()
一次十分耗时,而如果使用数组,用空间换时间的思想来实现,就能够不超时。
数组该如何初始化单链表?
看题目,数据范围都是>0
的,所以可以让head=-1
来表示空指针,并且创建一个下标idx=0
来进行移动
插入操作实现
e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
首先是赋值,然后改变指针方向,再让原来的元素直线自己,最后移动下标继续进行操作 最重要的是ne[idx] = ne[k], ne[k] = idx
这俩步的操作 次序一定不能颠倒 下面是我画的图方便理解
删除操作实现
这个就非常简单了,直接让这个下标的前一位 ,进行跳跃操作,而不是指向下一位,就能把中间的数删去了
idx理解
idx
的操作总是idx++
,这就保证了不同的idx
值对应不同的结点,这样就可以利用idx
把结构体内两个属性联系在一起了。因此,idx
可以理解为结点。
3、AC代码
#include <iostream>
using namespace std;
const int N = 100010;
int head, e[N], ne[N], idx;
// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// idx 存储当前已经用到了哪个点
//初始化
void init() {
head = -1; //头结点 相当于一个特殊的指针 -1表示空 即空指针
idx = 0; //下标 在插入和删除操作的时候 可以腾出空间 进行操作
}
//向头结点插入x
void add_to_head(int x) {
e[idx] = x, ne[idx] = head, head = idx++;
}
// 将x插到下标是k的点后面
void add(int k,int x) {
e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;//下标向下移一位,为下一次插入元素做准备。
}
// 将下标是k的点后面的点删掉
void remove(int k) {
ne[k] = ne[ne[k]];
//ne[ne[k]]:表示ne[k] 的前一个指针 相当于跳跃一个下标 即删除中间元素
}
int main() {
int m;
cin >> m;
init();//初始化
while (m--) {
int k, x;
char op;
cin >> op;
if (op=='H') {
cin >> x;
add_to_head(x);
} else if (op == 'D')
{
cin >> k;
if (k == 0) head = ne[head];//删除头节点
else remove(k - 1);
}
else // 因为有头结点下标为0 所以题意中的第k个数需要减去一 即 k-1
{
cin >> k >> x;
add(k - 1, x);
}
}
for (int i = head; i != -1;i = ne[i])
cout << e[i] << " ";
cout << endl;
return 0;
}
如果对您有帮助 能否给我点个 码字不易 感谢观看~~