[C++]数组模拟单链表

实现一个单链表, 链表初始为空, 支持下面三种操作
1. 向表头插入一个数
2. 删除第 k 个插入的数后面的数
3. 在 第 k 个插入的数后面插入一个数

输入

1. H x : 表头插入
2. D k : 删除
3. I k x: 插入

数据范围

1 < M < 100000

输入样例

10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6

输出样例

6 5 6 5

思路

一、 本题使用 数组模拟 单链表 ( 减少 new 时间 )
二、 使用 a[N] 存储元素  ,  使用 ne[N] 存储 对应元素的下一个结点的下标 ( 这里可以想象成一个二维表 )

假设下面的头结点是 1 , 那么下面的链表为 1⇒ 4 ⇒ 2 ⇒ 5
(注意 : 下标从 0 开始)

a[i]1425
ne[i]123-1

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],ne[N],idx,head; // 字符数组模拟单链表

// 初始化
void init () {
    head =-1;
    idx = 0;  // 注意这里的 idx 是从0开始
}

// 插入头结点
void insert_head(int x) {
    a[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}


// 在第 k 个插入的数后面插入一个数 x
void insert_ele(int k, int x) {
    a[idx] = x;
    ne[idx] = ne[k];
    ne[k]= idx;
    idx++;
}

 
// 删除第 k+1 个 插入的数
void del(int k) {
    ne[k] = ne[ne[k]];
}


int  main() {
    int m;
    int k, b;
    char op[2];
    
    cin>>m;
    init();
    for(int i = 0; i<m; i++) {
        cin >> op;
        if(op[0] == 'H') {
            cin>>k;
           insert_head(k); 
           
        } else if(op[0] == 'I') {
            cin>>k>>b;
            insert_ele(k-1,b);
        }  else {
            cin>>k;
            // 如果 k 为 0
            if(!k) {
                head = ne[head];
            }
            del(k-1);
        }
    }
    for(int i = head; i!= -1; i=ne[i]) {
        cout<<a[i]<<" ";
    }
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值