算法刷题笔记 单链表(C++实现)

文章目录

题目描述

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

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

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

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

输入格式

  • 第一行包含整数M,表示操作次数。
  • 接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
    • H x,表示向链表头插入一个数x
    • D k,表示删除第k个插入的数后面的数(当k0时,表示删除头结点)。
    • I k x,表示在第k个插入的数后面插入一个数x(此操作中k均大于 0)。

输出格式

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

数据范围

  • 1 ≤ M ≤ 100000
  • 所有操作保证合法。

基本思路

  • 在通常情况下以及我们的课程学习过程中,都是使用一个结构体表示链表结点或完整的链表。但是,这种方式需要每次使用new运算符创建一个新的链表结点,而这实际上是一个非常低效的方式。因此,实际的算法竞赛中,往往使用一个数组或向量来模拟出一个链表,称为静态链表,从而避免低效的动态内存分配。
  • 单链表的实际作用主要是写邻接表,用来存储图和树。

实现代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

typedef int value;
typedef int pos;
vector< pair<value, pos> > List;

int head = -1;

inline void insert_to_head(const int& x)
{
    List.push_back({x, head});
    head = List.size() - 1;
}

inline void del_after(const int& k)
{
    if(k == 0) head = List[head].second;
    else List[k - 1].second = List[List[k - 1].second].second;
}

inline void insert_after(const int& k, const int& x)
{
    List.push_back({x, List[k - 1].second});
    List[k - 1].second = List.size() - 1;
}

int main(void)
{
    int m;
    cin >> m;
    for(int i = 0; i < m; ++i)
    {
        char operation;
        cin >> operation;
        if(operation == 'H')
        {
            int x;
            cin >> x;
            insert_to_head(x);
        }
        else if(operation == 'D')
        {
            int k;
            cin >> k;
            del_after(k);
        }
        else if(operation == 'I')
        {
            int k, x;
            cin >> k >> x;
            insert_after(k, x);
        }
    }
    while(List[head].second != -1)
    {
        cout << List[head].first << " ";
        head = List[head].second;
    }
    cout << List[head].first << " ";
    return 0;
}

注意事项

  • 这里如果不使用cin进行输入,而是使用scanf函数的话,会出现奇怪的难以解释的错误。因此,以后的算法编程题目中,如果不是输入量特别大的话,都尽量使用更加简单的cin方式进行输入。
相关推荐
John_ToDebug3 小时前
判断力无法被 AI 替代,但它正在被你亲手扔掉
经验分享·笔记
2601_962218614 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
anew___4 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
吞下星星的少年·-·4 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
柳鲲鹏5 小时前
运气学概论:提纲草案
笔记
stolentime5 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt6 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++
和裕6 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技6 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
疯狂打码的少年7 小时前
【计算机网络】子网掩码与子网划分计算(含CIDR表示法)
服务器·笔记·计算机网络·php