数据结构——竞赛好帮手,静态链表

简介: 数据结构——竞赛好帮手,静态链表

模板例题的内容

实现一个单链表,链表初始为空,支持三种操作:
向链表头插入一个数;
删除第 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
原题链接:https://www.acwing.com/problem/content/828/

参考代码(C++版本)

#include <iostream>
using namespace std;
const int N = 100010;
//head 表示头结点的下标
//e[i] 表示结点i的值
//ne[i] 表示i的next指针
// idx 记录当前已经用到的结点数
int head , e[N],ne[N],idx;
//初始化
void init()
{
    head  = -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]];
}
int main()
{
    int m;
    cin >> m;
    init();
    //m次询问
    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];
            remove(k-1);
        }else
        {
            cin >> k>>x;
            add(k-1,x);
        }   
    }
    for(int i = head ;  i != -1; i = ne[i]) cout << e[i] <<' ';
    cout << endl;
    return 0;
}

为什么用数组来模拟链表


在竞赛中,使用new结构体的方式来实现链表在数据过于庞大的时候,会超时,也就是所谓的TLE(Time Limit Exceeded)


参数的理解


结构体实现单链表中指针思想在这里同样适用。


  1. head是头结点的下标。表示该单链表从数组中的起始位置
  2. . e[N]数组是存放每一个结点对应的值。e[6]就代表第六个结点的值(e是element的缩写)
  3. . ne[N]数组存放下一个结点的位置,相当于结构体单链表中的指针。在静态链表中采用了另外开一个数组ne[N]来存储下一个节点的下标的方式达到指针的效果(ne是next element的缩写)
  4. . idx 记录现在是第几个结点要进行操作


各个板块的分析


初始化


因为数组的索引都是从0开始的。故,用头指针指向-1来代表指向空

void init()
{
    head  = -1;
    idx  = 0;
}

在头结点插入


1. 将要插入的元素放到存放数据的e[N]数组中。现在是第idx个元素要进行操作。故,e[idx] = x;

2. 让这个插入的结点指向头结点指向的结点。形象来说,就是ne[N]这个数组中存放head存放的索引。ne[idx] = head;

3. 更新头指针中保存的信息,让头指针指向新插入的结点 head = idx;即通过头指针中保存的“地址”信息,可以找到相应的结点,获取其中的数据

4. 更新idx

void  add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head= idx++;
}

将x插入到下标是k的结点后面


1. 将x的数据存入

2. 让新插入的节点指向下标是k的节点的后一个节点 ne[idx] = ne[k];

3. 让下标是k的节点指向新插入的节点

4. 更新idx

void add(in k ,int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx++;
}

将下标是k的结点的后面结点删除


1. 和结构体链表的想法一样,让它指向它后一个结点的后一个结点

void remove(int k)
{
    ne[k] = ne[ne[k]];
}
相关文章
|
12月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
212 4
|
9月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
312 30
|
9月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
414 25
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
459 5
|
11月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
12月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
345 5
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1084 4
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
123 7

热门文章

最新文章