数据结构-单链表-双链表

这篇具有很好参考价值的文章主要介绍了数据结构-单链表-双链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

“收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!

模板一:单链表

  1. H x,表示向链表头插入一个数 x。

  2. D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。

  3. I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。

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

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100010;
int head,idx,e[N],ne[N];
// head:头结点的下标
// idx:存储当前已经用到了哪个点
// e[i]:表示节点i的值
// ne[i]:表示节点i的next指针是多少 i->next

//初始化
void init()
{
    head = 0;
    idx = 1;
}

//将x插入到头节点
// idx->next = head head = idx
void add_to_head(int x)
{
    e[idx] = x;
    ne[idx] = head;
    head = idx;
    idx++;
}

//将x插到下标是k的点后面
// idx->next = k->next k->next = idx 
void add(int k,int x)
{
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}

//将下标是k的点后面的点删掉
// k->next = (k->next)->next
void remove(int k)
{
    ne[k] = ne[ne[k]];
}

int main()
{
    int m;
    cin>>m;
    
    init();
    
    while(m--)
    {
        int k,x;
        char op;
        
        cin>>op;
        if(op == 'H')
        {
            cin>>x;
            add_to_head(x);
        }
        else if(op == 'D')
        {
            cin>>k;
            if(!k) head = ne[head];//删除头节点 head = head->next
            else remove(k);
        }
        else
        {
            cin>>k>>x;
            add(k,x);
        }
    }
    
    for(int i=head;i!=0;i=ne[i]) cout<<e[i]<<" ";
    cout<<endl;
    
    return 0;
}

模板二:双链表

  1. L x,表示在链表的最左端插入数 x。

  2. R x,表示在链表的最右端插入数 x。

  3. D k,表示将第 k 个插入的数删除。

  4. IL k x,表示在第 k 个插入的数左侧插入一个数。

  5. IR k x,表示在第 k 个插入的数右侧插入一个数。

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 10;
int idx,e[N],l[N],r[N];
// l[idx]: idx->prior
// r[idx]: idx->next

//初始化
// 0是左端点 1是右端点
void init()
{
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

//在节点a的右边插入一个数
//idx->prior = a;
//idx->next = a->next
//a->next->prior = idx;
//a->next = idx
void insert(int a,int x)
{
    e[idx] = x;
    l[idx] = a;
    r[idx] = r[a];
    l[r[a]] = idx;
    r[a] = idx;
    idx++;
}

//删除节点a
//a->next->prior = a->prior
//a->prior->next = a->next
void remove(int a)
{
    l[r[a]] = l[a];
    r[l[a]] = r[a];
}

int main()
{
    init();
    
    int m;
    cin>>m;
    while(m--)
    {
        string op;
        cin>>op;
        int k,x;
        
        if(op == "L")
        {
            cin>>x;
            insert(0,x);
        }
        else if(op == "R")
        {
            cin>>x;
            insert(l[1],x);//l[1] 1->prior 0永远是左边界 1永远是右边界
        }
        else if(op == "D")
        {
            cin>>k;
            remove(k+1);
        }
        else if(op == "IL")
        {
            cin>>k>>x;
            insert(l[k+1],x);//这里l[k+1] k+1 -> prior 因为idx从2开始 所以是k+1
        }
        else
        {
            cin>>k>>x;
            insert(k+1,x);
        }
    }
    
    for(int i=r[0];i!=1;i=r[i]) // 0是左边界 0->next是第一个开始的节点 1是右边界 到了1结束
    {
        cout<<e[i]<<" ";
    }
    cout<<endl;
    
    return 0;
}

问题一:

积灰这么久,这个当时被你收藏的东西对现在的你还有用吗?

答:当然是有用的啦!!!

具体模板和算法解释详情见Acwing算法基础课:活动 - AcWing文章来源地址https://www.toymoban.com/news/detail-613023.html

到了这里,关于数据结构-单链表-双链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。

                                                       大家好,今天我们来学习数据结构中的顺序表与链表!源码在最后附上 首先我们先来认识一下 顺序表 :                                       **如上图所示:很多人会以为数组就是顺序表,顺序表就是数组,这

    2024年02月21日
    浏览(60)
  • 数据结构之双链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 双链表的实现  初始化双链表  在双链表中尾插数据  在双链表中尾删数据 在双链表中头插数据  在双链表中头删数据  在双链表中的指定位置之后插入

    2024年04月26日
    浏览(53)
  • 【数据结构】单链表的简单实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元

    2024年02月04日
    浏览(57)
  • C语言简单的数据结构:单链表的有关算法题(2)

    接着我们介绍后面的三道题,虽然代码变多了但我们的思路更加通顺了 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 创建新链表,遍历原链表,将节点值小的进行尾插到新链表中 这里要多次进行对NULL的判断,开始传入列表,中间newHead的判断,循环出来一个为NULL的判断

    2024年04月15日
    浏览(64)
  • 数据结构之单链表的相关知识点及应用

     找往期文章包括但不限于本期文章中不懂的知识点: 个人主页 :我要学编程(ಥ_ಥ)-CSDN博客 所属专栏 :数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点  单链表中尾插数据  打印单链表中节点的数据  单链表中

    2024年04月15日
    浏览(38)
  • 【数据结构与算法】深入浅出:单链表的实现和应用

      🌱博客主页:青竹雾色间. 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注  ✨ 人生如寄,多忧何为  ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法: 尾插法: 插入(增)操作  删除(删)操作: 查找(查)操作: 修改(改

    2024年02月08日
    浏览(75)
  • 数据结构--双链表

    单链表 VS 双链表 单链表:无法逆向检索,有时候不太方便 双链表:可进可退,存储密度更低一丢丢 在p结点之后插入s结点 特殊处理:p是最后一个结点 用后插操作实现结点的插入有什么好处? 按位序插入前插操作: 找到前一个结点进行后插操作 ####删除p的后继结点q 特殊处

    2024年02月11日
    浏览(40)
  • 【数据结构】双链表

     带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。 1.准备工作  由于实际开发项目中,项目的实现都是采用模

    2024年02月14日
    浏览(40)
  • 数据结构之双链表

    双链表的思路和单链表大同小异,就是多加了一个前驱指针,希望大家好好学习双链表的代码

    2024年02月07日
    浏览(46)
  • 数据结构——双链表

    我宁愿靠自己的力量,打开我的前途,而不愿求有力者垂青  文章目录 双线向链表各接口函数名或变量名  双向链表接口实现源码 快速索引【头文件及函数声明】 双向链表接口实现 双向链表的构造分析 双向链表的定义及初始化 双向链表的插入和删除 往期回顾: 数据结构

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包