单链表

实现一个单链表,链表初始为空,支持三种操作:

  1. 向链表头插入一个数;
  2. 删除第 k 个插入的数后面的一个数;
  3. 在第 k 个插入的数后插入一个数。

现在要对该链表进行 𝑀 次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第 𝑘 个插入的数并不是指当前链表的第 𝑘 个数。例如操作过程中一共插入了 𝑛 个数,则按照插入的时间顺序,这 𝑛 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 𝑛 个插入的数。

输入格式

第一行包含整数 𝑀,表示操作次数。

接下来𝑀 行,每行包含一个操作命令,操作命令可能为以下几种:

  1. H x,表示向链表头插入一个数 𝑥。
  2. D k,表示删除第 𝑘 个插入的数后面的数(当 𝑘 为 0 时,表示删除头结点)。
  3. I k x,表示在第 𝑘 个插入的数后面插入一个数𝑥(此操作中 k𝑘 均大于 0)。

输出格式

共一行,将整个链表从头到尾输出。

数据范围

1≤M≤100000
所有操作保证合法。

输入样例:

1
2
3
4
5
6
7
8
9
10
11
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

输出样例:

1
6 4 6 5

题目中要求对第k个插入的数进行操作,如果用结构体实现的链表很难操作。所以这个题用数组来实现链表。

创建两个数组e[]和ne[]用索引idx做为下标,分别存储当前结点的值和下个结点的索引。idx即插入元素的顺序是每个元素的唯一标识。

头插

单链表_插入头结点.PNG

删除

单链表_删除结点.PNG

插入

单链表_在第k个插入的数后插入x.PNG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
using namespace std;
int idx=1,head=-1;
const int N = 1e5;
int e[N],ne[N];

void head_add(int x){
e[idx]=x;
ne[idx]=head;
head=idx++;
}

void del(int k){
if(k==0) head=ne[head];
else{
ne[k]=ne[ne[k]];
}
}

void insert(int k,int x){
e[idx]=x;
ne[idx]=ne[k];
ne[k]=idx++;
}
void print(){
for(int i=head;i!=-1;i=ne[i]){ //因为输入全为正数,所以值为-1说明遍历结束
cout<<e[i]<<" ";
}
}

int main(){
int m;
cin>>m;
while(m--){
string a;
cin>>a;
if(a=="H"){
int x;
cin>>x;
head_add(x);
}
else if(a=="D"){
int x;
cin>>x;
del(x);
}
else{
int k,x;
cin>>k>>x;
insert(k,x);
}
}
print();
return 0;
}