首页 > 编程语言 >C++ 链表

C++ 链表

时间:2024-08-22 23:36:58浏览次数:9  
标签:node nxt int 元素 C++ 链表 operation

1. 前言

链表:不仅存储 当前元素的数据,还存储着 元素排列顺序

2. 正题

2.1 如何存储节点?

我们可以使用 结构体 数组来存储 链表节点 

struct Node {
    int val; // 可以是 string 或其它复杂的类型
    int nxt;
} node[N];

Tip: 下标顺序不是单链表顺序

 

val 代表 元素本身,nxt 代表 连接的下一个元素 

 

2.2 插入元素的方法?

执行此操作的时间复杂度为 O(1)

在 链表 中插入元素

链表中的C 的指向为 链表中的A 的原来的指向(也就是B)

链表中的A 的指向变为 C

node[C].nxt = node[A].nxt;
node[A].nxt = C;

 

在 链表 开头插入元素

 

node[B].nxt = A;

 

在 链表 末尾插入元素

 

链表 中,末尾元素中的 nxt 始终保持 -1 的状态, 所以在 末尾 插入元素时, 插入元素 的 nxt 要 赋值 原末尾 nxt 值

node[B].nxt = node[A].nxt;
node[A].nxt = B;

 

2.3 删除元素的方法?

在 链表 中删除中间元素

让 A 的 nxt 直接指向 C

node[A].nxt = C;

在 链表 中删除队头元素

直接 pass 掉,不调用 队头 即可

在 链表 中删除队尾元素

将原来队尾的 nxt 的值 赋值 到 前一个的 nxt 值 里面

node[A].nxt = node[B].nxt;

 

3. 引例

Tip: 如果你想自己将这题独立完成做一遍,请自行到文章最底部进行传送

 

实现一个数据结构,维护一张表(最初只有一个元素 1)。需要支持下面的操作,其中 x 和 y 都是 1 到 106 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 105

1 x y :将元素 y 插入到 x 后面;

2 x :询问 x 后面的元素是什么。如果 x 是最后一个元素,则输出 0

3 x:从表中删除元素 xxx后面的那个元素,不改变其他元素的先后顺序。

输入格式

第一行一个整数 q 表示操作次数。

接下来 q 行,每行表示一次操作,操作具体间题目描述。

输出格式

对于每个操作 2输出一个数字,用换行隔开

 

4. 正题

定义相关变量 q (操作次数),operation(进行的操作), xy。并且需要一个 结构体 来储存 链表节点

const int N = 2e6;
int q, operation, x, y;
struct Node() {
    int nxt; // 此程序不需要 val 值
} node[N];

题目告知最初的表有一个 元素 1 在维护,所以我们对它进行 预处理

node[1].nxt = -1;

当 operation 的值为 1 时,将 y 插入在 x 的后面,所以排除直接开头插入元素时的代码,只用处理好 中间末尾 的插入即可

if (operation == 1) {
    cin >> x >> y;
    node[y].nxt = node[x].nxt; // 将原来 x 的 nxt 给到 y 的 nxt
    node[x].nxt = y; // x 的 nxt 变为 y
}

当 operation 的值为 2 时, 输出 x 后面的元素(即 node[x].nxt

if (operation == 2) {
    cin >> x;
    cout << node[x].nxt << endl;
}

当 operation 的值为 3 时, 删除 x 后面的元素(即 node[x].nxt

if (operation == 2) {
    cin >> x;
    node[x].nxt = node[node[x].nxt].nxt; // 相当于套娃,即 x 的下一个元素 为 x 的下一个元素 的下一个元素
}

最终代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6;
int q, operation, x, y;
struct Node {
    int  nxt;
} node[N];
signed main() {
    cin >> q;
    node[1].nxt = -1;
    for (int i = 1; i <= q; ++i) {
        cin >> operation;
        if (operation == 1) {
            cin >> x >> y;
            node[y].nxt = node[x].nxt;
            node[x].nxt = y;
        }
        else if (operation == 2) {
            cin >> x;
            if (node[x].nxt == -1) {
                cout << 0 << endl;
                continue;
            }
            cout << node[x].nxt << endl;
        }
        else if (operation == 3) {
            cin >> x;
            node[x].nxt = node[node[x].nxt].nxt;
        }
    }

}

相关练习

洛谷 B3631:传送门

标签:node,nxt,int,元素,C++,链表,operation
From: https://www.cnblogs.com/Mono-Awen/p/18374504

相关文章

  • c++一些面试题目
    摘自:https://www.cnblogs.com/lidabo/p/3284921.html1、Whatisachievedbyprefixingthe'static'keywordtoafile-levelfunctionorfile-levelvariabledeclaration? 使用static关键字修饰文件级的函数和变量起到什么作用? key:对变量来说,不允许文件外的程序访问;对......
  • C++模板的细节改进
    emsp;emsp;C++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析称模板参数结束符,方便我们编写模板相关的代码。1.模板的右尖括号emsp;emsp;在C++98/03的泛型编程中,模板实例化有一个很繁琐的地方,那就是连续两个右尖括号(>>)会被变异器解释称右移操作符,而不是模板参数表的结束......
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector(模拟实现)
    1.存储结构namespacezone{ template<classT>//需要模板 classvector { public:private: iterator_start; iterator_finish; iterator_endofstorage;};}可见,vector内核是由三个指针实现的2.默认成员函数 2.1.构造函数1.初始化列......
  • C++初学(14)
    14.1、while循环和for循环相比,while循环没有初始化和更新部分,它只有测试条件和循环体。while(text-condition)body首先程序计算圆括号内的测试条件(text-condition)表达式。如果该表达式为ture,则执行循环体中的语句。和for循环一样,循环体也由一条语句或两个花括号定义的......
  • CMake编译不同文件目录下的C++文件
        由于我们构建一个项目的时候,通常不会将所有的源文件放在一个文件目录下,这样既不方便开发,也不方便源码阅读,我们通常会对项目文件进行分层,比如分为include、src、res、lib这些目录,src下又分为model、controller、view这些目录。所以跨文件编译C++文件就相当必要了,如......
  • 数据结构--链表(单向链表--有头链表、无头链表)链表的插入、删除、修改、查找
    什么是链表?链表是一种基本的数据结构,用于存储一组数据元素。与数组不同,链表的元素在内存中并不连续存储。链表由一系列节点组成,每个节点包含以下两个主要部分:1.数据部分:存储节点所包含的数据。2.指针部分:存储指向下一个节点的指针(对于单向链表),或者存储指向前一个节点和下......
  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • 数据结构之链表(看不懂你来找我)
    数据结构......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......