gwl999

博客园 首页 新随笔 联系 订阅 管理
  34 随笔 :: 0 文章 :: 0 评论 :: 2087 阅读

5.16

双链表:


即有左节点右节点的链表

  • 算法题中主要的声明方式:

  • int l[N],//向左边的结点
     e[N],//存储的值
      r[N],//右边的结点
       idx;//变量指针
    void init() {
        l[1] = 0;
        r[0] = 1;
        idx = 2;//初始有两个被占有,也导致后面找到k位置的值,他的实际下标变成了k+1;
    }
  • void add(int k, int x) {
        //在k位置的后面插入一个数;
        e[idx] = x;//idx先赋值
        l[idx] = k;
        r[idx] = r[k];
    //先将idx的左右两边指针指好,idx的左边是k位置,idx右边是原来k的右边
        l[r[k]] = idx;
    //先找到原来k的右边,将他的左边变成新的idx位置
        r[k] = idx;
    //这时候再去改变原来k右边的位置,变成新的idx
        idx++;
    //指针位置加加
    }
  • void remove(int k) {
        //删除k位置的数;
        r[l[k]] = r[k];
    //k的左边,找到之后,现在它的右边原来k的右边
        l[r[k]] = l[k];
    //k的右边,找到之后,现在它的左边原来k的左边
    }

题目链接

https://www.acwing.com/problem/content/829/

  • #include "iostream"
    using namespace std;
    const int N = 100010;
    int l[N],//向左边的结点
     e[N],//存储的值
      r[N],//右边的结点
       idx;//变量指针
    void init() {
        l[1] = 0;
        r[0] = 1;
        idx = 2;
    }
    void add(int k, int x) {
        //在k位置的后面插入一个数;
        e[idx] = x;
        l[idx] = k;
        r[idx] = r[k];
        l[r[k]] = idx;
        r[k] = idx;
        idx++;
    }
    void remove(int k) {
        //删除k位置的数;
        r[l[k]] = r[k];
        l[r[k]] = l[k];
    }
    int main() {
        int m;
        cin >> m;
        while (m--) {
            int k, x;
            string str;
            cin >> str;
            if (str == "L") {
                cin >> x;
                add(0, x);
            } else if (str == "R") {
                cin >> x;
                add(l[1], x);
    
            } else if (str == "D") {
                cin >> k;
                remove(k + 1);
            } else if (str == "IL") {
                cin >> k >> x;
                add(l[k + 1], x);
                //这里为什么用l[k+1]而不是k;因为现在每次实际第k个位置是k+1,那么找到他的左边就直接l[k+1];
            } else if (str == "IR") {
                cin >> k >> x;
                add(k + 1, x);//同理这里找到k的位置,就是k+1;
            }
            for (int i = r[0]; i != 1; i = r[i])
                cout << e[i] << " ";
            return 0;
        }
    }
posted on   呓雫  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示