• 2.双链表


     

     

     双链表一个节点里面有两个指针,一个指向左边,一个指向右边

    不定义头结点和尾结点了

    令下标是0的点表示head

    令下标是1的点表示tail

    邻接表的知识:把每个点的所有邻边全部存下来

    邻接表就是n个单链表

    head[i]存储第i个点的邻边

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 100010;
     4 int e[N], l[N], r[N], idx;
     5 //l[i]存储i这个点左边是谁
     6 //r[i]存储i这个点右边是谁
     7 //初始化
     8 void init() {
     9     r[0] = 1;
    10     l[1] = 0;
    11     idx = 2; //因为0和1已经用过了
    12 } 
    13 //在下标是k的节点右边插入值为x的节点
    14 void add(int k, int x) {
    15     e[idx] = x;
    16     r[idx] = r[k];
    17     l[idx] = k;
    18     l[r[k]] = idx;
    19     r[k] = idx;
    20     idx++;
    21 } 
    22 //删除下标为k的节点
    23 void remove(int k) {
    24     r[l[k]] = r[k];
    25     l[r[k]] = l[k];
    26 }
    27 int main() {
    28     init();
    29     int m;
    30     cin >> m;
    31     while (m--) {
    32         string s;
    33         int k, x;
    34         cin >> s;
    35         if (s == "L") {
    36             cin >> x;
    37             add(0, x);
    38         } else if (s == "R") {
    39             cin >> x;
    40             add(l[1], x);
    41         } else if (s == "D") {
    42             cin >> k;
    43             remove(k + 1);
    44         } else if (s == "IL") {
    45             cin >> k >> x;
    46             add(l[k + 1], x);
    47         } else {
    48             cin >> k >> x;
    49             add(k + 1, x);
    50         }
    51     }
    52     for (int i = r[0]; i != 1; i = r[i]) {
    53         cout << e[i] << " ";
    54     }    
    55     cout << endl;
    56     return 0;
    57 }
  • 相关阅读:
    指针和数组的关系
    深入学习数组
    const关键字与指针
    野指针是什么
    指针带来的一些符号的理解
    指针的本质
    内存管理之堆
    内存管理之栈
    元类
    断点调式和面向对象进阶
  • 原文地址:https://www.cnblogs.com/fx1998/p/13284510.html
Copyright © 2020-2023  润新知