实现一个单链表, 链表初始为空, 支持下面三种操作
1. 向表头插入一个数
2. 删除第 k 个插入的数后面的数
3. 在 第 k 个插入的数后面插入一个数
输入
1. H x : 表头插入
2. D k : 删除
3. I k x: 插入
数据范围
1 < M < 100000
输入样例
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
输出样例
6 5 6 5
思路
一、 本题使用 数组模拟 单链表 ( 减少 new 时间 )
二、 使用 a[N] 存储元素 , 使用 ne[N] 存储 对应元素的下一个结点的下标 ( 这里可以想象成一个二维表 )
假设下面的头结点是 1 , 那么下面的链表为 1⇒ 4 ⇒ 2 ⇒ 5
(注意 : 下标从 0 开始)
a[i] | 1 | 4 | 2 | 5 |
---|---|---|---|---|
ne[i] | 1 | 2 | 3 | -1 |
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],ne[N],idx,head; // 字符数组模拟单链表
// 初始化
void init () {
head =-1;
idx = 0; // 注意这里的 idx 是从0开始
}
// 插入头结点
void insert_head(int x) {
a[idx] = x;
ne[idx] = head;
head = idx;
idx++;
}
// 在第 k 个插入的数后面插入一个数 x
void insert_ele(int k, int x) {
a[idx] = x;
ne[idx] = ne[k];
ne[k]= idx;
idx++;
}
// 删除第 k+1 个 插入的数
void del(int k) {
ne[k] = ne[ne[k]];
}
int main() {
int m;
int k, b;
char op[2];
cin>>m;
init();
for(int i = 0; i<m; i++) {
cin >> op;
if(op[0] == 'H') {
cin>>k;
insert_head(k);
} else if(op[0] == 'I') {
cin>>k>>b;
insert_ele(k-1,b);
} else {
cin>>k;
// 如果 k 为 0
if(!k) {
head = ne[head];
}
del(k-1);
}
}
for(int i = head; i!= -1; i=ne[i]) {
cout<<a[i]<<" ";
}
return 0;
}