实现一个单链表,链表初始为空,支持三种操作:
(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≤1000001≤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 4 6 5
1 #include<iostream> 2 3 using namespace std; 4 5 const int N = 100010; 6 7 //head表示头结点的下标 8 //e[i] 表示节点i的值 9 //ne[i]表示节点i的next的指针是多少 10 //idx存储我们当前已经用到了哪个点 11 int head,e[N],ne[N],idx; 12 //初始化 13 void init(){ 14 head = -1;//初始链表为空,-1表示空集 15 idx = 0;//当前从0这个点开始分配 16 } 17 //将x插入到头结点 18 void add_to_head(int x){ 19 e[idx] = x; 20 ne[idx] = head; 21 head = idx++; 22 } 23 //将x插入到k的后边 24 void add(int k,int x){ 25 e[idx] = x; 26 ne[idx] = ne[k]; 27 ne[k] = idx++; 28 } 29 //将下标是k的这个点删掉 30 void remove(int k){ 31 ne[k] = ne[ne[k]]; 32 } 33 int n; 34 int main(){ 35 cin >> n; 36 init(); 37 while(n --){ 38 int x,k; 39 char op; 40 cin >> op; 41 if(op == 'H'){ 42 cin >> x; 43 add_to_head(x); 44 }else if(op == 'D'){ 45 cin >> k; 46 if(!k) head = ne[head];//删除头结点特判一下 47 else remove(k - 1);//因为是0号点是第一个插入的点,1号点是第二个插入的点 48 }else{ 49 cin >> k >> x; 50 add(k - 1,x); 51 } 52 } 53 for(int i = head;i != -1;i = ne[i]) cout << e[i] << ' '; 54 return 0; 55 }