e[]存储当前元素的值
ne[]存储下一个元素的位置
idx为当前可用坐标
head为头结点
若当前位置为i,则ne[i] = i + 1;
初始化head和idx,head = -1, idx = 0
操作:
1.在头结点出插入元素x
e[idx] = x;//存储当前元素
ne[idx] = head;//操作1
head = idx ++;//操作2
2.删除第k个数
第k个数的下标为k - 1,设a = k - 1;
ne[a] = ne[ne[a]];
关于删除头结点的问题:
!!!当要删除的点是头结点的话,那么我删除点的下标就是-1,而实际我要删除的点是
所以如果要删除的是头结点: h = ne[h];
h = ne[h];
3.在第k个数后面插入元素x
第k个数下标设为a,a = k - 1
e[idx] = x;//存储当前元素
ne[idx] = ne[a];//操作1
ne[a] = idx ++;//操作2
acwing 826. 单链表
样例:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
全部代码:
#include <iostream>
using namespace std;
const int N = 100010;
int e[N], ne[N], idx, head;
void init()
{
idx = 0;
head = -1;
}
void insert(int x)
{
e[idx] = x;
ne[idx] = head;
head = idx;
idx ++;
}
void remove(int k)
{
ne[k] = ne[ne[k]];
}
void add(int k, int x)
{
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx ++;
}
int main()
{
init();
int m;
cin >> m;
while (m --)
{
char op;
cin >> op;
int k, x;
if (op == 'H')
{
cin >> x;
insert(x);
}
if (op == 'D')
{
cin >> k;
if (!k) head = ne[head];
else remove(k - 1);
}
if (op == 'I')
{
cin >> k >> x;
add(k - 1, x);
}
}
for (int i = head; i != -1; i = ne[i] ) cout << e[i] << ' ';
}
ps:第一次写博客,如有不对,欢迎大家指正!!!