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;
}
目录
相关文章
|
21天前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
21天前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
9天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
21天前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
97 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
18天前
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
21 0
|
26天前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
47 0
|
29天前
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
30 0
|
1月前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
1月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
11 0
|
1月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0