.单链表.

news2024/11/19 18:42:28

单链表就是将所要求得的数据呈现在一条链上进行求解。(用一种链式结构存储数据,这种结构就称之为链表)

题目:

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

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

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

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

输入格式

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

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

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

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

数据范围

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

 

 我的理解

 

 

从这个模拟也可以看出,由于数组下标从0开始,所以k=m对应的指针为m-1.

 

 代码:

//链表
#include<iostream>

using namespace std;

const int N=1e5+10;
//n[N]表示当前节点的值 
//ne[N]表示当前节点的下一指针是多少
//head表示头节点的指针(下标)
int n[N],ne[N],head;
int m;
//表示当前正在使用节点的值(idx 存储当前已经用到了哪个点)
//idx也表示当前时第几次插入。当idx=0时表示第一次插入,idx=3时表示第四次插入。(因为数组从0开始)
int idx;
void fir()
{
/*
头节点指针之所以为-1,是因为头节点在数组里本来就不存在
在这里抽象出来一个头节点是为了后续在头部的插入
而赋初值为-1是为了区分数组的第一个指针0
如果让idex赋初值为1,head=0也是可以的。目的是为了区分
*/
    head=-1;
    idx=0;
}
//将数值x插入到头节点
void add_to_head(int x)
{
    //先将指针idx指向的值x记录下来
    n[idx]=x;
    //指针idx的next指向应该指向头节点的next指向
    ne[idx]=head;
    //指针头节点的指向指针idx
    head=idx;
    //方便后续调用
    idx++;
}

//将数值x插入下标是k的后面
void add(int k,int x)
{
    //先将指针idx指向的值x记录下来
    n[idx]=x;
    //既然是插入到k节点的后面,那么指针的next指向就应该指向k的next指向
    ne[idx]=ne[k];
    //指针k的指向指针idx
    ne[k]=idx;
    //idx自加
    idx++;
}

//将下表为k的下一节点删掉
void remove(int k)
{
    //既然是将下表为k的下一节点删掉,那么直接忽略掉下一节点的指针
    //将指针k的next指向,指向指针k的next next指向(跳过k的下一节点)
    ne[k]=ne[ne[k]];
}

int main()
{
    fir();
    cin >> m;
    while(m--)
    {
        char a;
        cin >>a;
        if(a=='H')
        {
            int x;
            cin >>x;
            add_to_head(x);
        }
        else if(a=='D')
        {
            int k;
            cin >>k;
//对头节点进行特判,如果k=0即删除头节点。那直接将头节点的指针指向它的下一个指针,即舍弃头节点。
            if(!k) head=ne[head];
            remove(k-1);
        }
        else if(a=='I')
        {
            int x,k;
            cin >> k >> x;
            add(k-1,x);
        }
    }
//i=-1时为空集,每次循环结束指针i都指向下一个指针
//i初始等于头指针
    for(int i=head;i!=-1;i=ne[i]) cout << n[i] << " ";
    return 0;
}
//下面附上head=0,idex=1的算法(评论区的佬写的):

/*
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int cur=1, e[N], ne[N];

void add_k(int k, int x)
{
    e[cur] = x; ne[cur] = ne[k]; ne[k] = cur++;
}

void del_k(int k)
{
    ne[k] = ne[ne[k]];
}


int main()
{
    int m; cin >> m;
    while (m--) {
        char op; int k,x;
        cin >> op;
        if (op == 'H') {
            cin >> x;
            add_k(0,x);
        } else if (op == 'I') {
            cin >> k >> x;
            add_k(k,x); 
        } else {
            cin >> k;
            del_k(k);
        }
    }

    for (int j = ne[0]; j ; j = ne[j]) cout << e[j] << ' ';
    cout << endl;
    return 0;
}
*/
tips: 

头节点head本来就是不存在的,这里定义一个头节点是为了方便在头部( a[0] )之前插入而虚拟出来的 “头节点”

idex表示当前要插入的数值,idex是一直递增的,因为每一次插入或者删除都代表一次操作,不会每一次操作都对idex初始化(所以为全局变量)。

本题也大量利用了指针qwq

 

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

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

相关文章

Mysql报错红温集锦(一)(ipynb配置、pymysql登录、密码带@、to_sql如何加速、触发器SIGNAL阻止插入数据)

一、jupyter notebook无法使用%sql来添加sql代码 可能原因&#xff1a; 1、没装jupyter和notebook库、没装ipython-sql库 pip install jupyter notebook ipython-sql 另外如果是vscode的话还需要安装一些相关的插件 2、没load_ext %load_ext sql 3、没正确的登录到mysql…

Hibernate入门学习

目录 1、ORM思想概述 2、自定义ORM框架 3、第一个Hibernate程序开发步骤&#xff08;重要&#xff09; 1&#xff09;下载完整包 2&#xff09;创建项目&#xff0c;导入所需jar包 3&#xff09;建立student表 4&#xff09;创建和student表对应的Student实体类 5&…

Sarcasm detection论文解析 |A2Text-Net:一种用于讽刺检测的新型深度神经网络

论文地址 论文地址&#xff1a;A2Text-Net: A Novel Deep Neural Network for Sarcasm Detection | IEEE Conference Publication | IEEE Xplore github:lliyuan1117/A2Text-Net (github.com) 论文首页 A2Text-Net&#xff1a;一种用于讽刺检测的新型深度神经网络 &#x1f4c5…

Gradle 进阶学习 之 build.gradle 文件

build.gradle 是什么&#xff1f; 想象一下&#xff0c;你有一个大型的乐高项目&#xff0c;你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中&#xff0c;build.gradle 就是这个清单&#xff0c;它告诉计算机如何构建&#xff08;组合&#xff09;你的软…

阿里低代码引擎学习记录

官网 一、关于设计器 1、从设计器入手进行低代码开发 设计器就是我们用拖拉拽的方法&#xff0c;配合少量代码进行页面或者应用开发的在线工具。 阿里官方提供了以下八个不同类型的设计器Demo&#xff1a; 综合场景Demo&#xff08;各项能力相对完整&#xff0c;使用Fusion…

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

16、ESP32 Web

Web 服务器具有移动响应能力&#xff0c;可以使用本地网络上的任何设备作为浏览器进行访问。 示例功能&#xff1a; 构建 Web 服务器控制连接到 ESP32 的 LED在本地网络的浏览器上输入 ESP32 IP 地址访问 Web 服务器通过单击 Web 服务器上的按钮&#xff0c;更改 LED 状态 //…

C#语言基础

一、复杂数据类型 1. 枚举 1.1 基本概念 1.1.1 枚举是什么 枚举是一个被命名的整型常量的集合&#xff0c;一般用它来表示状态、类型等等 1.1.2 申明枚举和申明枚举变量 申明枚举和申明枚举变量是两个概念 申明枚举&#xff1a;相当于是创建一个自定义的枚举类型 申明枚…

C#实战—代码实现收发文件智能化

在信息化的今天&#xff0c;收发电子文档几乎是每个朋友都要经历的事情。比如班级学委和班长需要收发作业&#xff0c;企业管理者需要收发工作文件。但是&#xff01;&#xff01;&#xff01; 每到要交结果时&#xff0c;往往会发现总会有一些人没有即使交上&#xff0c;50个…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

面试中算法(2的整数次幂)

判断一个正整数是否是2的整数次幂&#xff08;如16是2的4次方&#xff0c;返回true;18不是2的整数次幂&#xff0c;则返回false&#xff09;&#xff0c;要求性能尽可能高。 使用一个整型变量&#xff0c;让它从1开始不断乘以2&#xff0c;将每一次乘2的结果和 目标整数进行比较…

【python的魅力】:教你如何用几行代码实现文本语音识别

文章目录 引言一、运行效果二、文本转换为语音2.1 使用pyttsx32.2 使用SAPI实现文本转换语音2.3 使用 SpeechLib实现文本转换语音 三、语音转换为文本3.1 使用 PocketSphinx实现语音转换文本 引言 语音识别技术&#xff0c;也被称为自动语音识别&#xff0c;目标是以电脑自动将…

【网站项目】社区互助平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Object Desktop - Stardock 软件开发商系列套件

Windows 的一大优势在于可高度自定义&#xff0c;能让我们把它打造成一个最符合自己需求的工作和娱乐工具。 在桌面增强工具套件 Object Desktop 中&#xff0c;包含了 Stardock 旗下 10 款生产力和美化工具&#xff0c;可帮助我们打造出美观、实用、高效的 Windows 系统。 St…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…

文件(夹)批量重命名数字、字母、日期、中文数字大写小写

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 目标是重命名下面5个文件&#xff08;也可以是文件夹等&#xff0c;任意&#xff09;&#xff0c;从大写中文数字“贰”开始 打开工具&#xff0c;找到“文…

SNR: Signal to Noise Ratio

https://www.xx.com/watch?vmyrZ_R6xIZA Fang, Y., Armin, A., Meredith, P. et al. Accurate characterization of next-generation thin-film photodetectors. Nature Photon 13, 1–4 (2019). https://doi.org/10.1038/s41566-018-0288-z Wang, F., Zhang, T., Xie, R. e…

[XYCTF新生赛]-PWN:fmt解析(scanf格式化字符串漏洞,任意地址写)

查看保护 查看ida 这里没什么好说的 完整exp&#xff1a; from pwn import* context(log_leveldebug) #pprocess(./fmt) premote(gz.imxbt.cn,20975) backdoor0x4012BEp.recvuntil(bgift: ) printf_addrint(p.recv(14),16) print(hex(printf_addr)) libcELF(./libc-2.31.so) …

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…