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;
}
目录
相关文章
|
3月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
49 0
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
70 5
|
3月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
134 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
3月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
54 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
3月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
3月前
|
算法 Java
数据结构与算法学习五:双链表的增、删、改、查
双链表的增、删、改、查操作及其Java实现,并通过实例演示了双向链表的优势和应用。
30 0
数据结构与算法学习五:双链表的增、删、改、查
|
3月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
31 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
3月前
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
27 0