Acwing数据结构:单链表

server/2024/11/9 17:08:04/

单链表

主要思想:使用数组实现链表(而不用结构体,结构体代码更长,后续图论也是基于数组实现),即静态链表。因为动态链表使用new申请空间需要较多的时间,而算法要求的是以较少的时间完成任务。

  • 单链表:最主要用单链表写邻接表,用邻接表存储图或者树;
  • 双链表:优化某些问题

单链表:头指针head指向第一个结点,初始为-1.数组e[]存储结点的值,数组ne[]存储对应结点的下一个结点的下标,形成一个链条。本质是用数组下标来操作对应结点。

需要背过的板子:

const int N=100010;//head表示头节点的下标
//e[i]表示节点i的值
//ne[i]表示节点i的next指针是多少
//idx存储当前已经用到了哪个点
int head,e[N],ne[N],idx=0;void init(){head=-1;//空idx=0;//当前可以从0号点开始用
}//在链表头插入一个x
void add_to_head(int x){e[idx] = x;//存值ne[idx] = head;//next指向head指的head = idx;//head指向idx的位置idx ++;//idx后移
}//将x插入到下标为k的点的后面
void add(int k,int x){e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx ++;
}//将下标是k的点后面的一个点删掉
void remove(int k){ne[k] = ne[ne[k]];
}

我们通过一个题目来实战一下。

实现一个单链表,链表初始为空,支持三种操作:
1.向链表头插入一个数;
2.删除第 k 个插入的数后面的一个数;
3.在第 k个插入的数后插入一个数。
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。

在这里插入图片描述
输入样例:

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

实现思路:

  • 设置数组e[]存储节点值,数组ne[]存储对应节点下一个节点的下标;
  • 设置头指针head指向第一个节点,初始值为-1;
  • 设置指针idx表示当前操作位置,初始为0即指向数组的第一个位置,单增;

样例模拟如下图所示:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4cf43f5fa64949b2b0734c7dbeb2f177.png

代码实现:

#include <iostream>using namespace std;const int N=100010;//head表示头节点的下标
//e[i]表示节点i的值
//ne[i]表示节点i的next指针是多少
//idx存储当前已经用到了哪个点
int head,e[N],ne[N],idx=0;void init(){head=-1;//空idx=0;//当前可以从0号点开始用
}//在链表头插入一个x
void add_to_head(int x){e[idx] = x;//存值ne[idx] = head;//next指向head指的head = idx;//head指向idx的位置idx ++;//idx后移
}//将x插入到下标为k的点的后面
void add(int k,int x){e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx ++;
}//将下标是k的点后面的一个点删掉
void remove(int k){//当让在这特判进行删除头节点也可以//if(k==-1) head=ne[head];ne[k] = ne[ne[k]];
}int main(){int m;cin >> m;init();while(m--){char s; cin >> s;int k,x;if(s == 'H'){cin >> x;add_to_head(x);}else if(s == 'D'){cin >> k;if(k == 0) head = ne[head];//删除头节点//特判可以放在删除函数中~remove(k-1);//函数中传的是下标,为k-1}else if(s == 'I'){cin >> k >> x;add(k-1,x);//函数中传的是下标,为k-1}}for(int i = head;i !=-1 ;i = ne[i]) cout<<e[i]<<' ';//遍历输出也背住cout<<endl;return 0;
}

好的,以上就是数组模拟单链表的一些内容啦~


http://www.ppmy.cn/server/118625.html

相关文章

计算机网络(网络层)

网络层的主要任务是实现网络互联&#xff0c;进而实现数据包在个网络中间的传输。 网络层主要解决的问题 &#xff08;1&#xff09;网络层向运输层提供怎样的服务 &#xff08;2&#xff09;网络层寻址问题 &#xff08;3&#xff09;路由选择问题 网路层提供的两种服务 …

Python画笔案例-050 绘制天空之眼

1、绘制天空之眼 通过 python 的turtle 库绘制 天空之眼&#xff0c;如下图&#xff1a; 2、实现代码 绘制 天空之眼&#xff0c;以下为实现代码&#xff1a; """天空之眼.py """ import math import turtledef draw_square(length,level):if l…

MySQL通过备份恢复的方式搭建主从/重建从库

系列文章目录 MySQL5.7基于innobackupex工具进行全量备份/恢复 MySQL5.7.42安装 文章目录 系列文章目录前言一、MySQL安装二、单节点MySQL通过全量备份恢复的方式搭建主从1.从库安装2.主库全量备份3.将备份传输至目标服务器(从库)4.通过备份恢复的方式搭建从库步骤4.1.检查从库…

DevExpress WinForms v24.1新版亮点:升级的HTML CSS支持

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

【Hot100】LeetCode—84. 柱状图中最大的矩形

目录 1- 思路题目识别单调栈 2- 实现⭐84. 柱状图中最大的矩形——题解思路 3- ACM 实现 原题链接&#xff1a;84. 柱状图中最大的矩形 1- 思路 题目识别 识别1 &#xff1a;给定一个数组 heights &#xff0c;求解柱状图的最大面积 单调栈 使用 Stack 来实现&#xff0c;遍…

Spring Boot-应用启动问题

在使用 Spring Boot 进行开发时&#xff0c;应用启动问题是开发人员经常遇到的挑战之一。通过有效排查和解决这些问题&#xff0c;可以提高应用的稳定性和可靠性。 1. Spring Boot 启动问题的常见表现 Spring Boot 应用启动失败通常表现为以下几种情况&#xff1a; 应用启动…

OceanBase 企业版OMS 4.2.3的使用

OceanBase 企业版OMS 4.2.3的使用 一、界面说明 1.1 概览 1.2 数据迁移 1.3 数据同步 1.4 数据源管理 1.5 运维监控 1.6 系统管理 二、功能说明 注意&#xff1a; 在数据迁移与数据同步的功能中&#xff0c;如果涉及到增量操作&#xff1a; 1.需要使用sys租户的用…

Go语言练习——语法实践

目录 一、数组 1.多维数组的声明和使用 2.数组与切片的转换 3.数组在函数中的使用 二、切片 1.切片的动态扩容机制 2.切片的复制与修改 3.切片在排序算法中的应用 三、结构体 1.结构体的嵌套与方法 2.结构体与JSON的序列化 3.结构体的工厂模式 四、映射 1.映射的并发访问 2.映射…