数组模拟单链表

图形:

image.png

题目

实现一个单链表,链表初始为空,支持三种操作:
(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
所有操作保证合法。
输入样例:
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. final static int N = 100010;
  2. static int[] e = new int[N];
  3. static int[] en = new int[N];
  4. static int idx = 0, head = -1;
  5. while(n-- > 0) {
  6. String[] strs = br.readLine().split(" ");
  7. int m = Integer.parseInt(strs[1]);
  8. int x = 0;
  9. if(strs.length > 2) {
  10. x = Integer.parseInt(strs[2]);
  11. }
  12. switch (strs[0]) {
  13. case "D":
  14. if(m == 0) {
  15. head = en[head];
  16. } else {
  17. deleteLinked(m - 1);
  18. }
  19. break;
  20. case "H":
  21. insertHead(m);
  22. break;
  23. case "I":
  24. insertLinked(m - 1,x);
  25. break;
  26. default:
  27. System.out.println();
  28. }
  29. }
  30. showLinked();
  31. }
  32. private static void deleteLinked(int k) {
  33. en[k] = en[en[k]];
  34. }
  35. private static void insertHead(int m) {
  36. e[idx] = m;
  37. en[idx] = head;
  38. head = idx;
  39. idx++;
  40. }
  41. private static void insertLinked(int k,int x) {
  42. e[idx] = x;
  43. en[idx] = en[k];
  44. en[k] = idx;
  45. idx++;
  46. }
  47. private static void showLinked() {
  48. int k = head;
  49. while (k != -1) {
  50. System.out.print(e[k]+" ");
  51. k = en[k];
  52. }
  53. }

单调栈

单调队列

KMP算法