基础算法-单链表

news2024/11/26 4:45:12

单链表 -> 邻接表:主要用于存储图和树。

双链表 : 主要用于优化某些问题。

 单链表的相关操作:1.单链表的初始化   2.将x插到头节点    3.将x插入到下标是k的节点后面  4.将下标是k的节点的后面一个节点删除

1.单链表的初始化

代码:

//单链表的初始化
void init()
{
    head = -1;
    idx = 0;
}

2.将x插到头节点

图解:

代码:

void add_to_head(int x)
{
    e[idx] = x;//需要插入的数值
    ne[idx] = head;//该节点指向head所指向的位置
    head = idx++;//head指向当前位置,并使idx右移
}

 3.将x插入到下标是k的节点后面

图解:

 代码:

将x插入到下标是k的节点后面
void add(int k,int x)
{
    e[idx] = x;//更新需要插入位置的数值
    ne[idx] = ne[k];//该点指向k指针所指向的位置
    ne[k] = idx++;//k指针指向idx,并使idx右移一个单位
}

4.将下标是k的节点的后面一个节点删除 

图解:

 代码:

//删除第k个节点后面的一个节点
void remove(int k)
{
    ne[k] = ne[ne[k]];
}

 例题:

实现一个单链表,链表初始为空,支持三种操作:

  1. 向链表头插入一个数;
  2. 删除第 kk 个插入的数后面的数;
  3. 在第 kk 个插入的数后插入一个数。

现在要对该链表进行 MM 次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第 kk 个插入的数并不是指当前链表的第 kk 个数。例如操作过程中一共插入了 nn 个数,则按照插入的时间顺序,这 nn 个数依次为:第 11 个插入的数,第 22 个插入的数,…第 nn 个插入的数。
输入格式

第一行包含整数 MM,表示操作次数。

接下来 MM 行,每行包含一个操作命令,操作命令可能为以下几种:

  1. H x,表示向链表头插入一个数 xx。
  2. D k,表示删除第 kk 个插入的数后面的数(当 kk 为 00 时,表示删除头结点)。
  3. I k x,表示在第 kk 个插入的数后面插入一个数 xx(此操作中 kk 均大于 00)。

输出格式 

共一行,将整个链表从头到尾输出。

数据范围

1≤M≤1000001≤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

代码:

#include<iostream>
using namespace std;

const int maxn = 100010;

int e[maxn],ne[maxn],idx,head;

//初始化
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();
    while(M -- ){
        char S;
        int k,x;
        cin >> S;
        if(S == 'H'){
            cin>>x;
            add_to_head(x);
        }
        else if(S == 'D'){
            cin >> k;
            if(!k) head = ne[head];
            else remove(k - 1);//第k个元素对应的索引为k - 1
        }
        else{
            cin>>k>>x;
            add(k-1,x);
        }
    }
    for(int i = head;i != -1;i =ne[i]){
        printf("%d ",e[i]);
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第117天:免杀对抗-反VT沙盒反虚拟机反调试进程APC注入项目保护

知识点 #知识点&#xff1a; 1、反VT-沙盒检测-Go&Python&C 2、反调试-调试检测&进程注入-C 3、反VT反调试-程序保护-工具项目类#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修…

Tripwire 完整性分析工具(Linxu系统)

环境&#xff1a;centos7 工作流程&#xff1a; 当前的系统数据状态建立数据库定期比较系统现状与数据库中的状态属性改变有详细报告分析报告发现入侵 1、安装相关软件包 [roothello ~]# yum install epel-release -y 已加载插件&#xff1a;fastestmirror Repository base …

自学网络安全(黑客)全笔记

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

了解Unity编辑器之组件篇Mesh(三)

Mesh&#xff1a;是一种三维模型的表示形式&#xff0c;它由一系列顶点、三角形&#xff08;或其他多边形&#xff09;和相关属性组成。Mesh用于表示物体的外观和形状&#xff0c;它是可见物体的基本组成部分。通过操作Mesh&#xff0c;开发者可以实现各种视觉效果、物理模拟和…

AI人工智能一键图片/视频换脸-Roop

软件介绍 Roop 换脸技术是一种基于深度学习的人脸图像处理技术。 技术原理 Roop换脸技术的实现主要分为两个步骤&#xff1a;人脸检测与对齐、特征融合与生成。 1.人脸检测与对齐在Roop换脸技术中&#xff0c;首先需要对输入的图像进行人脸检测与对齐。这一步骤的目的是确保…

Ubuntu搭建Samba服务-学习记录

文章目录 Ubuntu安装Samba流程Samba配置文件Samba添加账户配置文件修改Samba服务控制设置开机自动启动通过systemctl 启动服务通过 rc.local 启动 Windows访问参考链接 当前文章仅用于记录&#xff0c;在 Ubuntu中安装使用Samba&#xff0c;在Windows访问 系统环境&#xff1a;…

ChatGPT应用|科大讯飞星火杯认知大模型场景创新赛开始报名了!

ChatGPT发布带来的 AI 浪潮在全球疯狂蔓延&#xff0c;国内掀起的大模型混战已经持续半年之久&#xff0c;国产大模型数量正以惊人的速度增长&#xff0c;据不完全统计&#xff0c;截止7月14号已经达到了111个&#xff0c;所谓的“神仙打架”不过如此了吧。 &#xff08; 包括但…

SpringBoot与文档excel,pdf集成案例分享

一、文档类型介绍 1、Excel文档 Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具&#xff0c;在系统开发中&#xff0c;经常用来把数据转存到Excel文件&#xff0c;或者Excel数据导入系统中&#xff0c;这就涉及数据转换问题。 2、PDF文档 PDF是可移植文档格…

Java程序设计六大原则设计模式

Java程序设计六大原则 一、单一职责原则&#xff1a; 一个接口或者类只有一个原因引起变化&#xff0c;即一个接口或者类只有一个职责&#xff0c;负责一件事情。&#xff08;此原则同样适用于方法&#xff09; 好处&#xff1a;1、复杂性降低&#xff1b;2、可读性提高&…

深度学习和神经网络

人工神经网络分为两个阶段&#xff1a; 1 &#xff1a;接收来自其他n个神经元传递过来的信号&#xff0c;这些输入信号通过与相应的权重进行 加权求和传递给下个阶段。&#xff08;预激活阶段&#xff09; 2&#xff1a;把预激活的加权结果传递给激活函数 sum :加权 f:激活…

代码随想录算法训练营之JAVA|第十一天| 239. 滑动窗口最大值

今天是第11天刷leetcode&#xff0c;立个flag。 算法挑战链接 239. 滑动窗口最大值https://leetcode.cn/problems/sliding-window-maximum/description/ 第一想法 题目理解&#xff1a;找到滑动窗口中最大的值&#xff0c;写入数组中&#xff0c;返回该数组即可。 第一个想…

VeriEye 13.0商用虹膜识别软件python SDK试用指南

最近&#xff0c;商用虹膜识别软件VeriEye 13.0发布&#xff0c;且额外地新增了python接口&#xff0c;这样就很方便大家直接调用其提供的虹膜识别接口了。 在使用python接口前&#xff0c;需要先下载安装试用版SDK&#xff0c;然后激活许可证。具体如下&#xff1a; 1. VeriE…

代码审计利器 Fortify SCA 2023.1(23.1) Crack

Fortify SCA 支持丰富的开发环境、语言、平台和框架&#xff0c;可对开发与生产混合环境进行安全检查。 25 种编程语言 超过 911,000 个组件级 API 可检测超过 961 个漏洞类别 支持所有主流平台、构建环境和 IDE。 Fortify SCA是一款商业软件&#xff0c;价格较为昂贵&#xf…

基金”中考”百亿基金经理”惜墨如金”

时下是基金二季报披露高峰&#xff0c;基民往往会期盼基金经理能在季报里带来“定心丸”。但个别基金经理的投资分析仅一两百字带过&#xff0c;对业绩亏损和调仓思路等关键问题更是直接忽略。 券商中国记者发现&#xff0c;有管理规模超370亿的基金经理&#xff0c;投资运作分…

ZohoProjects入选2022年度项目及项目组合管理类

有效的项目管理方法保证项目按照进度、成本、质量要求进行交付&#xff0c;是针对单个项目或项目群的管理&#xff0c;从而确保项目符合企业的战略目标&#xff0c;实现企业收益最大化。 对于项目管理工作来说&#xff0c;我们通常会认为只有专业的经理才能胜任&#xff0c;软件…

【每日一题】—— C. Game with Reversing (Codeforces Round 879 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

flask框架的请求处理逻辑

Django 和 Flask 是 Python 的两个非常流行的 Web 框架&#xff0c;它们对 HTTP 请求的处理方式有一些区别。 在 Django 中&#xff0c;当你的应用接收到一个 HTTP 请求时&#xff0c;Django 会将请求封装为一个 HttpRequest 对象&#xff0c;然后通过视图函数的参数传递这个对…

【计算机网络】简易TCP网络小程序

文章目录 1. 简易TCP网络程序1.1 服务端1.1.1 服务端创建套接字1.1.2 服务端绑定1.1.3 服务端监听1.1.4 服务端获取连接1.1.5 服务端处理请求 1.2 客户端1.2.1 客户端创建套接字1.2.2 客户端连接服务器1.2.3 客户端发起请求 1.3 服务器测试1.4 单执行流服务器的弊端 2. 多进程版…

【个人笔记】Linux的用户登录与退出

目录 Linux 的发行版Linux 的登录1.命令行登录2.ssh登录3.图形界面登录图形模式与文字模式的切换方式 Linux 的退出Linux 的关机与重启Linux 查看用户登录Linux在线命令工具 Linux 的发行版 Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。 目前市面上较知名…