数组模拟单链表/双链表

调试漫谈:如果用vscode调试一定要保证路径和文件名没有中文

单链表

这个比较简单,注意插入在某个数的右边,应该先将“待改动”的数作为被赋值数。也就是说一定要先ne[idx] = head / ne[k],再考虑ne[k]/head = idx

init: null -> -1 

after: x -> x -> x ... x -> -1

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int maxn = 1e5 + 10;
 5 int M, k, x;
 6 char op;
 7 
 8 int val[maxn], ne[maxn], head = -1, idx = 0;
 9 
10 void ins_h(int x) {
11     idx++;
12     val[idx] = x;
13     ne[idx] = head;
14     head = idx;
15 }
16 
17 void ins(int k, int x) {
18     idx++;
19     val[idx] = x;
20     ne[idx] = ne[k];
21     ne[k] = idx;
22 }
23 
24 void del(int k) { ne[k] = ne[ne[k]]; }
25 
26 int main() {
27     cin >> M;
28     while (M--) {
29         cin >> op;
30         if (op == 'H') {
31             cin >> x;
32             ins_h(x);
33         }
34         if (op == 'D') {
35             cin >> k;
36             if (k == 0)
37                 head = ne[head];
38             else
39                 del(k);
40         }
41         if (op == 'I') {
42             cin >> k >> x;
43             ins(k, x);
44         }
45     }
46 
47     for (int i = head; i != -1; i = ne[i]) printf("%d ", val[i]);
48 
49     return 0;
50 }

双向链表

 采用 1  idx idx idx ... idx 0 的写法,(毕竟不能访问l[-1]这种东西。。。)

从左往右获取即为

for (int i = r[0]; i != 1; i = r[i]) printf("%d ", val[i]);

#include <iostream>
using namespace std;
const int maxn = 4e5 + 10;

int val[maxn], l[maxn], r[maxn], M, x, k, idx;
string op;

void init() {
  r[0] = 1;
  l[1] = 0;
  idx = 1; // idx0 / idx1 function as endpoint of left / right
  // 0 idxl x idxlk k idlrk x x idxr 1
  //the direction of process depend on you insert in L or R
  // modify l -> modify r <-
}

void L(int x) {
  idx++;
  l[r[0]] = idx;
  l[idx] = 0;
  r[idx] = r[0];
  r[0] = idx;
  val[idx] = x;
}
void R(int x) {
  idx++;
  r[l[1]] = idx;
  r[idx] = 1;
  l[idx] = l[1];
  l[1] = idx;
  val[idx] = x;
}
void D(int k) {
  l[r[k]] = l[k];
  r[l[k]] = r[k];
}
void IL(int k, int x) {
  idx++;
  l[idx] = l[k];
  l[k] = idx;
  r[idx] = k;
  r[l[idx]] = idx;
  val[idx] = x;
}
void IR(int k, int x) {
  idx++;
  r[idx] = r[k];
  r[k] = idx;
  l[idx] = k;
  l[r[idx]] = idx;
  val[idx] = x;
}

int main() {
  init();
  cin >> M;
  while (M--) {
    cin >> op;
    if (op == "L") {
      cin >> x;
      L(x);
    }
    if (op == "R") {
      cin >> x;
      R(x);
    }
    if (op == "D") {
      cin >> k;
      D(k + 1);
    }
    if (op == "IL") {
      cin >> k >> x;
      IL(k + 1, x);
    }
    if (op == "IR") {
      cin >> k >> x;
      IR(k + 1, x);
    }
  }

  for (int i = r[0]; i != 1; i = r[i]) printf("%d ", val[i]);
  return 0;
}

 

 
 
 
posted @ 2021-09-28 17:32  _vv123  阅读(55)  评论(0)    收藏  举报