侧边栏壁纸
博主头像
Hope博主等级

努力赚钱的工科研究生

  • 累计撰写 362 篇文章
  • 累计创建 129 个标签
  • 累计收到 5 条评论
标签搜索

手写单链表

Hope
2022-08-18 / 0 评论 / 0 点赞 / 442 阅读 / 642 字
温馨提示:
本文最后更新于 2022-08-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

插入和删除两种操作如下
链表的问题画图就很容易理解了。

image.png


#include<bits/stdc++.h>

using namespace std;
const int N = 1e6+10;
int e[N], ne[N], h = -1, idx;

int n;
void add_head(int x){
    e[idx] = x;
    ne[idx] = h;
    h = idx++;
}

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

void add_k(int k, int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx++;
}
int main(){
    cin >> n;
    char op;
    // 第k个插入的点是 k - 1下标
    while(n --){
        cin >> op;
        //H x,表示向链表头插入一个数 x。
        if(op == 'H'){
            int x;
            cin >> x;
            add_head(x);
        }
        //D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。
        else if(op == 'D'){
            int k;
            cin >> k;
            if(!k) h = ne[h];
            del_num(k - 1);
        }
        //I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。
        else{
            int k, x;
            cin >> k >> x;
            add_k(k - 1 ,x);
        }
        
    }
    
    for(int i = h; i != -1; i = ne[i]) cout << e[i] << " ";
    
    return 0;
}
0

评论区