第二讲:数据结构 AcWing 826. 单链表

2024-02-29 1112阅读

温馨提示:这篇文章已超过387天没有更新,请注意相关的内容是否还可用!

目录

    • 数组模拟链表
      • 数组模拟单链表
      • 单链表
      • 思路 && 代码 看图更好理解
      • 推荐一下y总的刷题网站

        数组模拟链表

        笔试的题目大部分 大部分涉及到链表都是十万级别的 用数组的方式创建链表速度很快,不会超时,而如果用new 一个结构体的话 大部分就是比较慢的 所以不建议使用

        数组模拟单链表

        单链表在笔试题中用的最多是 领接表

        领接表最多的应用是存储数和图

        双链表 最多的应用就是来优化某些问题

        假设当前的节点

        我们可以用e[N] 来表示当前节点的值是多少 用ne[N]来表示当前指针的下一个节点是多少

        第二讲:数据结构 AcWing 826. 单链表

        数据为

        e[0 ] =3 ne[0] =1

        e[1] = 5 ne[1] =2

        e[2] =7 ne[2] =3

        e[3] =9 ne[3] = -1

        原题链接:

        单链表

        实现一个单链表,链表初始为空,支持三种操作:

        向链表头插入一个数;

        删除第 k个插入的数后面的数;

        在第 k个插入的数后插入一个数。

        现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。

        注意:题目中第 k个插入的数并不是指当前链表的第 k 个数。

        例如操作过程中一共插入了 n个数,则按照插入的时间顺序,这 n个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。

        输入格式

        第一行包含整数 M,表示操作次数。

        接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

        H x,表示向链表头插入一个数 x。

        D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。

        I k x,表示在第 k个插入的数后面插入一个数 x

        (此操作中 k 均大于 0)。

        输出格式

        共一行,将整个链表从头到尾输出。

        数据范围

        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 4 6 5

        思路 && 代码 看图更好理解

        #include 
        using namespace std;
        const int N = 100010;
        // head 表示头结点的下标
        // e[i] 表示节点i的值
        // ne[i] 表示节点i的next指针是多少
        // idx 存储当前已经用到了哪个点 每一次使用idx都可以理解成创建一个新的节点
        int head, e[N], ne[N], idx;
        // 初始化
        void init()
        {
            head = -1; //head节点指向的-1 表示没有指向任何数据
            idx = 0;   //表示当前链表没有任何节点
        }
        // 将x插到头结点
        void add_to_head(int x)
        {
            e[idx] = x,  		//表示当前节点的值为x 
            ne[idx] = head,		//表示当前节点的下一个节点为头结点指向的节点
            head = idx ++ ; 	//表示头结点指向idx这个节点 并将idx +1 操作
        }
        //注意这里面的链表操作 都是需要往后看 不能往前看 因为单链表只能往后看齐
        // 将x插到下标是k的点后面
        void add(int k, int x)
        {
            e[idx] = x, 		//表示当前节点(新创建的) 值为x
            ne[idx] = ne[k], 	//表示当前节点的下一个节点 为第k个节点的下一个节点
            ne[k] = idx ++ ;	//表示第k个节点的下一个节点为当前节点idx 并将idx +1操作
        }
        // 将下标是k的点后面的点删掉
        void remove(int k)
        {
            ne[k] = ne[ne[k]]; //表示第k个节点指向的下一个节点被修改为 下一个节点的下一个节点
            				//这在工程里面就会导致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) head = ne[head];
                    else remove(k - 1);
                }
                else
                {
                    cin >> k >> x;
                    add(k - 1, x);
                }
            }
            for (int i = head; i != -1; i = ne[i]) cout 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]