ACM算法训练【单链表双链表的数组实现方法】

简介: ACM算法训练【单链表双链表的数组实现方法】


1.单链表


题目概述


44f7f266c486486a8d83a1dfb61acb90.png


输入样例:


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


思路


单链表的存储结构

2c9f5830b263414199d4759fffdecb41.png


链表插入操作:


63757aa69efe4bc99bd42ea4d26941d9.png


链表删除操作:


3f473730305f49bfb6c25c5fa79e2f53.png


代码奉上


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int e[N],ne[N],idx,head=-1;
void removepo(int k)  //删除节点
{
    ne[k]=ne[ne[k]];
}
void add_to_head(int x)  //在头节点插入数据
{
    e[idx]=x;
    ne[idx]=head;
    head=idx++;
}
void add(int k,int x)  //普通插入
{
    e[idx]=x;
    ne[idx]=ne[k];
    ne[k]=idx++;
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int k,x;
        string op;
        cin>>op;
        if(op=="H")
        {
            scanf("%d",&x);
            add_to_head(x);
        }
        else if(op=="D")
        {
            scanf("%d",&k);
            if(k==0) head=ne[head];  //头节点特判
            else removepo(k-1);
        }
        else
        {
            scanf("%d%d",&k,&x);
            add(k-1,x);
        }
    }
    for(int i=head;i!=-1;i=ne[i])
        printf("%d ",e[i]);
    return 0;
}


2.双链表


题目概述


748a47f54f4e4461a6191d4126aa8160.png


数据范围


1≤M≤100000
所有操作保证合法。


输入样例:


10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2


输出样例:


8 7 7 3 2 9


思路


类似单链表
初始化时偷懒,0表示头节点,1表示尾节点


a932e4ae84024df881830db947c6e555.png


删除操作:


9a60a8fb2f6649caa841e9814f9acc19.png


代码奉上


#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int l[N],r[N],e[N],idx;
void init()
{
    r[0]=1;
    l[1]=0;
    idx=2;
}
void removepo(int k)
{
    r[l[k]]=r[k];
    l[r[k]]=l[k];
}
void add(int k,int x)
{
    e[idx]=x;
    r[idx]=r[k];
    l[idx]=k;
    l[r[k]]=idx;
    r[k]=idx++;
}
int main()
{
    init();
    int n;
    cin>>n;
    while(n--)
    {
        string m;
        int k,x;
        cin>>m;
        if(m=="L")
        {
            scanf("%d",&x);
            add(0,x);
        }
        else if(m=="R")
        {
            scanf("%d",&x);
            add(l[1],x);
        }
        else if(m=="D")
        {
            scanf("%d",&k);
            removepo(k+1);
        }
        else if(m=="IL")
        {
            scanf("%d%d",&k,&x);
            add(l[k+1],x);
        }
        else
        {
            scanf("%d%d",&k,&x);
            add(k+1,x);
        }
    }
    for(int i=r[0];i!=1;i=r[i])
        printf("%d ",e[i]);
    return 0;
}
目录
相关文章
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
542 5
算法系列之递归反转单链表
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
604 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
879 25
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
277 0
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
580 5
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
288 4
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表