AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

01_02_数据结构_01_链表

作者: 作者的头像   综上所述_ ,  2025-06-07 22:41:33 · 江苏 ,  所有人可见 ,  阅读 3


0


01_单链表 merge_interval


用数组存储链表(用空间换时间): 速度>>用new动态创建节点


#include <iostream>

using namespace std;

const int N = 100010;
/*
e[i] 表示节点的 val
ne[i] 表示节点的 next
idx 表示下一个可用节点的下标,只会递增,哪怕有节点被删,idx 也不会减少(空间换时间)
0下标代表头结点,不存储实际val,只存储next;
节点从下标 1 开始分配(idx初始为1)
*/
int m, e[N], ne[N], idx = 1;

void add(int k, int x) {
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx++; // idx记得++,因为该下标已经用过了
}

void remove(int k) { ne[k] = ne[ne[k]]; }

int main() {
    cin >> m;
    while (m--) {
        char opt;
        int k, x;
        cin >> opt;
        if (opt == 'H') {
            cin >> x;
            add(0, x);
        } else if (opt == 'I') {
            cin >> k >> x;
            add(k, x);
        } else {
            cin >> k;
            remove(k);
        }
    }
    for (int i = ne[0]; i != 0; i = ne[i]) cout << e[i] << " ";

    return 0;
}

02_双链表 merge_interval

#include <iostream>

using namespace std;

const int N = 100010;
int m, e[N], ln[N], rn[N], idx = 2; // 头尾节点占了0, 1下标,idx 从 2 开始

void add(int k, int x) {
    e[idx] = x;
    rn[idx] = rn[k], ln[rn[k]] = idx;   // 先指后面
    ln[idx] = k, rn[k] = idx++;         // 再指前面; idx记得++,因为该下标已经用过了
}

void remove(int k) {
    rn[ln[k]] = rn[k], ln[rn[k]] = ln[k];
}

int main() {
    // 0下标代表头结点,1下标代表尾结点,都不存储实际val,只存储 lnext 和 rnext
    rn[0] = 1, ln[1] = 0;
    cin >> m;
    while (m--) {
        string opt;
        int k, x;
        cin >> opt;
        if (opt == "L") {
            cin >> x;
            add(0, x);
        } else if (opt == "R") {
            cin >> x;
            add(ln[1], x);
        } else if (opt == "D") {
            cin >> k;
            remove(k + 1); // 注意+1,因为第 k 个节点的下标是 k + 1
        } else if (opt == "IL") {
            cin >> k >> x;
            add(ln[k + 1], x);
        } else {
            cin >> k >> x;
            add(k + 1, x);
        }
    }
    for (int i = rn[0]; i != 1; i = rn[i]) cout << e[i] << " ";

    return 0;
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息