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;
}
目录
相关文章
|
10月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1021 6
|
5月前
|
机器学习/深度学习 存储 算法
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
本文系统讲解从基本强化学习方法到高级技术(如PPO、A3C、PlaNet等)的实现原理与编码过程,旨在通过理论结合代码的方式,构建对强化学习算法的全面理解。
675 10
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
|
7月前
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
174 5
算法系列之递归反转单链表
|
5月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
98 0
|
7月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
191 30
|
7月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
294 25
|
8月前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
1384 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
10月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
267 5
|
10月前
|
存储 算法 安全
SnowflakeIdGenerator-雪花算法id生成方法
SnowflakeIdGenerator-雪花算法id生成方法
346 1
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表

热门文章

最新文章