【C++】Day13 数组实现单链表 Acwing.826 单链表 (详细)

前言: 你好!我是Cpt,一位大一双非本科学生,C++方向,目前备战蓝桥杯,欢迎一起学习交流~

1、题目

链接.

在这里插入图片描述

2、思路

为什么不用结构体实现单链表?

因为在竞赛的时候如果使用结构体来写单链表,通常都会超时,比较new()一次十分耗时,而如果使用数组,用空间换时间的思想来实现,就能够不超时。

数组该如何初始化单链表?

看题目,数据范围都是>0的,所以可以让head=-1来表示空指针,并且创建一个下标idx=0来进行移动

插入操作实现

e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;
首先是赋值,然后改变指针方向,再让原来的元素直线自己,最后移动下标继续进行操作 最重要的是ne[idx] = ne[k], ne[k] = idx这俩步的操作 次序一定不能颠倒 下面是我画的图方便理解
在这里插入图片描述

删除操作实现

这个就非常简单了,直接让这个下标的前一位 ,进行跳跃操作,而不是指向下一位,就能把中间的数删去了
在这里插入图片描述

idx理解

idx的操作总是idx++,这就保证了不同的idx值对应不同的结点,这样就可以利用idx把结构体内两个属性联系在一起了。因此,idx可以理解为结点。

3、AC代码

#include <iostream>
using namespace std;

const int N = 100010;
int head, e[N], ne[N], idx;
// head 表示头结点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针是多少
// idx 存储当前已经用到了哪个点

//初始化
void init() {
    
    
    head = -1; //头结点 相当于一个特殊的指针 -1表示空 即空指针
    idx = 0; //下标  在插入和删除操作的时候 可以腾出空间 进行操作
}

//向头结点插入x
void add_to_head(int x) {
    
    
    e[idx] = x, ne[idx] = head, head = idx++;
}
// 将x插到下标是k的点后面
void add(int k,int x) {
    
    
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx++;//下标向下移一位,为下一次插入元素做准备。
}

// 将下标是k的点后面的点删掉  
void remove(int k) {
    
    
    ne[k] = ne[ne[k]];
    //ne[ne[k]]:表示ne[k] 的前一个指针  相当于跳跃一个下标 即删除中间元素
}

int main() {
    
    
    int m;
    cin >> m;

    init();//初始化

    while (m--) {
    
    
        int k, x;
        char op;
        cin >> op;
        if (op=='H') {
    
    
            cin >> x;
            add_to_head(x);
        }  else if (op == 'D')
        {
    
    
            cin >> k;
            if (k == 0) head = ne[head];//删除头节点
            else remove(k - 1); 
        }
        else  //  因为有头结点下标为0 所以题意中的第k个数需要减去一 即 k-1 
        {
    
    
            cin >> k >> x;
            add(k - 1, x);
        }
    }
    for (int i = head; i != -1;i = ne[i])
        cout << e[i] << " ";
    cout << endl;
    return 0;
}


如果对您有帮助 能否给我点个 码字不易 感谢观看~~

猜你喜欢

转载自blog.csdn.net/weixin_49486457/article/details/122825779
今日推荐