单链表结构,数据就像一个链条一样存储。每个数据都有指向下一个值得指针。

链表的书写可以是利用指针,也可以是利用数组。利用指针书写,速度比较慢,这里利用数组进行链表的书写。
题目来源: https://www.acwing.com/activity/content/problem/content/863/1/
题目描述:
实现一个单链表,链表初始为空,支持三种操作:
(1) 向链表头插入一个数;
(2) 删除第k个插入的数后面的数;
(3) 在第k个插入的数后插入一个数
现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。
输入格式
第一行包含整数M,表示操作次数。
接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
(1) “H x”,表示向链表头插入一个数x。
(2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。
(3) “I k x”,表示在第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
|
输出样例:
C++代码实现:
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <iostream>
using namespace std; const int N = 100010;
int head, e[N], ne[N], idx;
void init() { head = -1; idx = 0; }
void add_to_head(int x) { e[idx] = x; ne[idx] = head; head = idx++; }
void add(int k, int x) { e[idx] = x; ne[idx] = ne[k]; ne[k] = idx++; }
void remove(int k) { ne[k] = ne[ne[k]]; }
int main() { int n; cin >> n;
init();
while(n--) { int a, x; char op; cin >> op; if (op == 'H') { cin >> x; add_to_head(x); } else if ( op == 'I') { cin >> a >> x; add(a - 1, x); } else { cin >> a; if (!a) head = ne[head]; else remove(a - 1); } }
for(int i = head; i != -1; i = ne[i]) printf("%d ", e[i]); return 0; }
|