算法模板之双链表图文详解

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:算法模板、数据结构
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📋前言
  • 一. ⛳️使用数组模拟双链表讲解
    • 1.1 🔔为什么我们要使用数组去模拟双链表?
    • 1.2 🔔用数组模拟实现双链表
      • 1.2.1 👻整体框架说明
      • 1.2.2 👻双链表查找和修改
      • 1.2.3 👻双链表插入结点
      • 1.2.4 👻双链表删除结点
    • 1.3 🌟模板提取(重点)🌟
      • 1.3.1 👻有详细注释版
      • 1.3.1 👻无详细注释版
  • 二. ⛳️题目练习
    • 2.1 题目
    • 2.2 输入样例
    • 2.3 输出样例
    • 2.4 c++代码
  • 📝结语

📋前言

    💬 hello! 各位铁子们大家好哇,今天作者给大家带来的算法模板是使用数组模拟双链表,让我们一起加油进步。
    📚 系列专栏:本期文章收录在《算法模板》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝



一. ⛳️使用数组模拟双链表讲解

1.1 🔔为什么我们要使用数组去模拟双链表?

    由于该问题已经在第一期《算法模板之单链表讲解》这篇文章中已经叙述过了,相信看过第一期的小伙伴应该已经知道,在这里就不多阐述,感兴趣的小伙伴可以自行跳转浏览。


1.2 🔔用数组模拟实现双链表

1.2.1 👻整体框架说明

初始状态:左边界结点指向右边界结点,右边界结点指向左边界结点
在这里插入图片描述


插入结点状态:

  • 创建数组valprene 分别存储某个结点的值以及它的前驱指针和后继指针;
  • 下标 0 和 1 分别存储边界结点;
  • 从下标 2 的位置开始插入结点;
  • 本文仅仅使用左右边界结点的指针,无需在意其中存的值。

    综上所述,真正的结点相当于从下标为2的位置开始往后所有插入的数,左右边界结点仅起到一个指针的效果。如下图的3,4,5,6为真正的结点。
在这里插入图片描述

1.2.2 👻双链表查找和修改

因为是使用数组模拟出来的链表,所以对于查找和修改直接通过数组下标进行遍历查找即可,这里就不多叙述。


1.2.3 👻双链表插入结点

在第k个结点的右边插入一个数 x:如下图在第2个结点后面插入一个数 7。
在这里插入图片描述

代码展示(建议结合图示看注释):

//在结点k的右边插入一个数x
void insert(int k, int x)
{//将待插值赋给新结点val[idx] = x;//将新结点分别指向插入位置的右结点和左结点ne[idx] = ne[k];pre[idx] = k;//将新结点的右边结点向左指向新结点pre[ne[k]] = idx;//将新结点的左边结点向右指向新结点ne[k] = idx;//更新结点索引idx++;
}

其他形式插入:在链表的最左端插入、最右端插入、在第k个结点的左边插入一个数 x
    在其他位置插入,大家可以按照上面的方式自行模拟。不过,在算法竞赛中如果每种插入方式都模拟一下,显然是太浪费时间了。仔细观察可以发现,我们仍然可以使用上面的insert(int k, int x)函数实现各种位置的插入,只需要稍微变动一下传入的 k 值。

  1. 在第k个结点的左边插入一个数 x: 如下图,在第2个结点的左边插入一个数7,可以转化为在第1个结点后面插入一个数7,执行语句:insert(pre[k], x) 即可。
    在这里插入图片描述

  1. 在链表的最左端插入一个数x: 如下图,在最左端插入一个数x,可以转化为在左边结点后面插入一个数x,执行 insert(0, x) 即可。
    在这里插入图片描述

  1. 在链表的最右端插入一个数x: 如下图,在最右端插入一个数x,可以转化为在右边界结点的左结点后面插入一个数x,执行 insert(pre[1], x) 即可。
    在这里插入图片描述

1.2.4 👻双链表删除结点

删除第k个结点
在这里插入图片描述

代码展示(建议结合图示看注释):

//删除第k个结点
void remove(int k)
{//将待删除结点的左结点的后继指针指向待删除结点的右结点ne[pre[k]] = ne[k];//将待删除结点的右结点的前驱指针指向待删除结点的左结点pre[ne[k]] = pre[k];
}

1.3 🌟模板提取(重点)🌟

1.3.1 👻有详细注释版

模板代码

// val[i] 表示结点i的值
// pre[i] 表示结点i的前驱指针
// ne[i] 表示结点i的后继指针
// idx 存储当前已经用到了哪个点,即记录当前下标位置
int val[N], pre[N], ne[N], idx;//初始化
void init()
{//左边界结点指向右边界结点,右边界结点指向左边界结点ne[0] = 1;pre[1] = 0;//更新结点索引,因为下标0和1被左右边界结点占用。idx = 2;
}//在结点k的右边插入一个数x
//只使用本函数可以通过改变k的值,实现其他形式的插入。
void insert(int k, int x)
{//将待插值赋给新结点val[idx] = x;//将新节点分别指向插入位置的右结点和左结点ne[idx] = ne[k];pre[idx] = k;//将新结点右边一节点向左指向新结点pre[ne[k]] = idx;//将新结点左边一节点向右指向新结点ne[k] = idx;//更新结点索引idx++;
}//删除第k个结点
void remove(int k)
{//将待删除结点的左结点的后继指针指向待删除结点的右结点ne[pre[k]] = ne[k];//将待删除结点的右结点的前驱指针指向待删除结点的左结点pre[ne[k]] = pre[k];
}

1.3.1 👻无详细注释版

int val[N], pre[N], ne[N], idx;//初始化
void init()
{ne[0] = 1;pre[1] = 0;idx = 2;
}//在结点k的右边插入一个数x
void insert(int k, int x)
{val[idx] = x;ne[idx] = ne[k];pre[idx] = k;pre[ne[k]] = idx;ne[k] = idx;idx++;
}//删除第k个结点
void remove(int k)
{ne[pre[k]] = ne[k];pre[ne[k]] = pre[k];
}


二. ⛳️题目练习

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

2.1 题目

在这里插入图片描述

2.2 输入样例

10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2

2.3 输出样例

8 7 7 3 2 9

2.4 c++代码

#include<iostream>using namespace std;const int N = 100010;
int val[N], pre[N], ne[N], idx;//初始化
void init()
{ne[0] = 1;pre[1] = 0;idx = 2;
}//在结点k的右边插入一个数x
void insert(int k, int x)
{val[idx] = x;ne[idx] = ne[k];pre[idx] = k;pre[ne[k]] = idx;ne[k] = idx;idx++;
}//删除第k个结点
void remove(int k)
{ne[pre[k]] = ne[k];pre[ne[k]] = pre[k];
}int main()
{int m;cin >> m;init();//切记:不要忘记进行初始化while(m--){int k, x;string op;cin >> op;//判断执行哪种操作if(op == "L")//在链表的最左端插入x{cin >> x;insert(0, x);}else if(op == "R")//在链表的最右端插入x{cin >> x;insert(pre[1], x);}else if(op == "D")//把第k个插入的数删除{cin >> k;remove(k+1);//因为初始化从下标为2位置开始插入结点,所以第k插入数的下标为k+2-1}else if(op == "IL")//第k个插入的数左侧插入一个数{cin >> k >> x;insert(pre[k+1], x);}else//第k个插入的数右侧插入一个数{cin >> k >> x;insert(k+1, x);}}//打印链表for(int i = ne[0]; i != 1; i = ne[i]) cout << val[i] << " ";cout << endl;return 0;
}


📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日本服务器:确保其稳定性的几个要点

​  在租用日本服务器时&#xff0c;用户们大多一定会关注它的稳定性&#xff0c;其实这些顾及都是正常的。毕竟&#xff0c;网站要想正常运行&#xff0c;保障服务器稳定是关键。本文将讨论有关如何保障日本服务器稳定性的一些有用技巧&#xff0c;希望对您有所帮助。 1.注重…

鸿蒙端H5容器化建设——JSB通信机制建设

1. 背景 2023年鸿蒙开发者大会上&#xff0c;华为宣布为了应对国外技术封锁的潜在风险&#xff0c;2024年的HarmonyOS NEXT版本中将不再兼容Android&#xff0c;并推出鸿蒙系统以及其自研的开发框架&#xff0c;形成开发生态闭环。同时&#xff0c;在更高维度上华为希望将鸿蒙…

2024最新独立站建站教程!WordPress 搭建独立站的方法和步骤

不知道大家是否听说过 WordPress &#xff1f;最近有个国外博主分享&#xff0c;她60岁的奶奶居然用WordPress建了个关于她宠物日常的小博客&#xff0c;看来 WordPress 在国外真的是很普及。其实&#xff0c;国外很多商家还利用 WordPress 搭建自己的电商网站&#xff0c;那说…

在idea中使用mysql(超详细)

一、连接mysql 在IDE开发工具中也是可以使用mysql的&#xff0c;这里以开发java常用的IntelliJ IDEA为例。 1. 打开idea&#xff0c;右上角有数据库侧边栏&#xff0c;打开侧边栏点击加号->数据源&#xff0c;可以看到支持很多数据库&#xff0c;选择mysql。 2. 首次使用需要…

华为OD机试 - 书籍叠放 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【Linux基础】1. Linux 启动过程

文章目录 【 1. 内核的引导 】【 2. 运行init 】 运行级别 【 3. 系统初始化 】【 4. 建立终端 】【 5. 用户登录系统 】【 6. 图形模式与文字模式的切换方式 】【 7. Linux关机 】 Linux系统的启动过程分为 5个阶段&#xff1a; &#xff08;1&#xff09;内核的引导。 &#…

斩获AIoT新维奖两项大奖,移远通信以卓越算力产品引领智能物联新未来

12月15日&#xff0c;由物联网智库、智次方研究院主办&#xff0c;广东省物联网协会、深圳市物联网协会、深圳市智能终端产业协会协办的中国AIoT产业年会暨2024年智能产业前瞻洞察大典在深圳顺利举办。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信应邀参加大会…

[计网01] 物理层 详细解析笔记,特性

计算机网络的物理层是网络协议栈中的第一层&#xff0c;负责传输原始的比特流&#xff08;bitstream&#xff09;通过物理媒介进行通信。物理层主要关注传输介质、信号的编码和调制、数据传输速率以及数据传输的物理连接等方面。 相关特性 机械特性&#xff08;Mechanical Ch…

Windows操作系统:引领桌面计算的传奇

导言 Windows操作系统作为桌面计算领域的巨头&#xff0c;深刻影响了个人计算机的发展历程。本文将深入探讨Windows的发展历程、关键特性以及其在桌面计算中的卓越地位。 1. 历史与版本 Windows 1.0到Windows 10&#xff1a; Windows经历了多个版本的迭代&…

创投课程第五期 | 超越比特币:探索BTC生态的无限可能

协会邀请了来自水滴资本&#xff08;Waterdrip Capital&#xff09;的投资总监——Elaine&#xff0c;作为VC创投课程第5期的嘉宾&#xff0c;在北京时间12月17日(周日)晚上21:00 PM-22:00 PM&#xff0c;届时将与所有对Web3投资、创业心怀热忱的朋友们共同探讨《超越比特币&am…

AI性能再提升12.5%,ZStack Cube 超融合一体机基于第五代英特尔®至强®可扩展处理器解决方案发布

12月15日&#xff0c;以“Al无处不在&#xff0c;创芯无所不及”为主题的2023英特尔新品发布会暨AI技术创新派对上&#xff0c;云轴科技ZStack与英特尔联合发布基于第五代英特尔 至强 可扩展处理器的 ZStack Cube 超融合一体机解决方案白皮书&#xff08;简称解决方案&#xff…

前端框架如何帮助开发者构建应用程序?

目录 前言 1.项目简介 2. 平台特性 2.1 构架特性 2.2 功能特性 3. 整体架构 4. 技术栈 平台的开放性&#xff1a; 平台高拓展性&#xff1a; 5. 基础功能及搭建 5.1 代码生成器 5.2 工作流程 5.3 门户设计 5.4 大屏设计 5.5 报表设计 5.6 第三方登录 5.7 多租…