yxc_第二章 数据结构(一)_链表
写在前面:链表这一部分完结,我觉得链表最重要的还是根据题目来写代码(数组模拟指针),可能是大二上已经学过应试版数据结构的缘故吧。最后,还是希望自己能够持之以恒,在寒假完成算法基础课。(最近几天都睡到了上午11点,太颓废了5555)
目录
一、单链表
1、基础知识
2、AcWing 826
二、双链表
1、AcWing 827
一、单链表
1、基础知识
做算法题时,主要使用数组来模拟链表(原因是快)。
如果使用指针和new来操作链表,时间效率太低,对于多数题目都会超时。
e[i]表示下标 i 的点的值域,ne[i]表示下标 i 的点的指针域。
2、AcWing 826
实现一个单链表,链表初始为空,支持三种操作:
- 向链表头插入一个数;
- 删除第 k 个插入的数后面的数;
- 在第 k 个插入的数后插入一个数。
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。
输入格式
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:
H x
,表示向链表头插入一个数 x。D k
,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。I k x
,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。
输出格式
共一行,将整个链表从头到尾输出。
数据范围
1≤M≤100000
所有操作保证合法。
输入样例:
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
#include<iostream>using namespace std;const int N = 100010;
/*
head:头指针,其值为头结点的下标
idx:当前正在用到的那个点,用过一个点,就idx++
(即使这个点已经删除,idx也不需要减)
*/
int head, e[N], ne[N], idx;//初始化
void init()
{head = -1;idx = 0;
}//将x插入到头结点的位置,即head指向x
void add_to_head(int x)
{e[idx] = x;ne[idx] = head;head = idx ++ ;
}//将x插入到下标为k的节点之后
void add(int k, int x)
{ e[idx] = x;ne[idx] = ne[k];ne[k] = idx ++ ;
}//删除下标为k的点之后的那个点
void remove(int k)
{ne[k] = ne[ne[k]];
}int main()
{int m;cin >> m;init();//没有初始化的话,head = 0。此时会超时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];//当k为0时,删除头结点else remove(k - 1);//注意要加else,否则k=0时,两个语句都会执行}else{cin >> k >> x;add(k - 1, x);}}for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';cout << endl;return 0;
}
需要注意:if判断语句中的==不要写成了=
二、双链表
1、AcWing 827
实现一个双链表,双链表初始为空,支持5 种操作:
- 在最左侧插入一个数;
- 在最右侧插入一个数;
- 将第 k 个插入的数删除;
- 在第 k 个插入的数左侧插入一个数;
- 在第 k 个插入的数右侧插入一个数
现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。
输入格式
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:
L x
,表示在链表的最左端插入数 x。R x
,表示在链表的最右端插入数 x。D k
,表示将第 k 个插入的数删除。IL k x
,表示在第 k 个插入的数左侧插入一个数。IR k x
,表示在第 k 个插入的数右侧插入一个数。
输出格式
共一行,将整个链表从左到右输出。
数据范围
1≤M≤100000
所有操作保证合法。
输入样例:
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
输出样例:
8 7 7 3 2 9
#include<iostream>
using namespace std;const int N = 100010;int e[N], l[N], r[N], idx;//初始化
void init()
{r[0] = 1, l[1] = 0, idx = 2;
}//在下标为k的元素右边,插入x
void add(int k, int x)
{e[idx] = x; r[idx] = r[k];l[idx] = k; l[r[k]] = idx;r[k] = idx ++ ;
}//删除下标为k的元素
void remove(int k)
{r[l[k]] = r[k];l[r[k]] = l[k];
}int main()
{int m;cin >> m;init();while (m -- ){string op;cin >> op;int k, x;if (op == "L")//要注意这里输入的是string类型变量,不能用‘’{cin >> x;add(0, x);}else if (op == "R"){cin >> x;add(l[1], x);}else if (op == "D"){cin >> k;remove(k + 1);//这里不能用k - 1}else if (op == "IL"){cin >> k >> x;add(l[k + 1], x);//这里不能用k - 1}else if (op == "IR"){cin >> k >> x;add(k + 1, x);//这里不能用k - 1}}for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << " ";cout << endl;return 0;
}
yxc_第二章 数据结构(一)_链表相关推荐
- yxc_第二章 数据结构(一)_栈和队列
目录 一.栈和队列的代码操作 1.AcWing 828 模拟栈 2.AcWing 829 模拟队列 二.单调栈 1.AcWing 830 单调栈 三.单调队列 1.AcWing 154 滑动窗口 一. ...
- yxc_第二章 数据结构(二)_Trie树
目录 一.基本概念 二.AcWing 835 Trie字符串统计 本题思路: 一.基本概念 接下来的案例类似于邻接矩阵,横轴表示str[ i ] - 'a'(省略了7~25),竖轴表示节点编号.红色的 ...
- yxc_第二章 数据结构(一)_kmp算法
目录 一.思路 二.AcWing 831 KMP字符串 三.时间复杂度 一.思路 当子串P与模式串S匹配一部分时,在两个串的接下来的一个元素不相同,而在已经匹配成功的串中存在前缀等于后缀.此时后缀最后 ...
- 第二章简答_微观 第二章 效用论
第二章 效用论 效用论分为基数效用论和序数效用论 基数效用论:效用可以用基数数字来表示. 序数效用论:效用无法用数字表示,只能根据满足程度的大小进行排序. 一.基数效用论 1.效用(名词解释):指消费 ...
- Java天之痕第二章攻略_轩辕剑参外传:天之痕主线详细攻略大全
本文小编为您带来轩辕剑参外传:天之痕主线详细攻略大全,至于这次的游戏,在战斗方面基本没有什么难度,只要稍微注意一下属性相克就可以了. 玩家在游戏初期可以得到一只符鬼,你必须选择它的属性.共有金.木.水 ...
- Java天之痕第二章攻略_轩辕剑参外传天之痕第二章怎么过 通关图文攻略
刚刚给大家介绍了一下第一章的图文攻略,现在给大家说下第二章,在第二章的剧情里面,我们来到黑山镇,具体的剧情攻略如下: 到北方的黑山镇(可以先去东南方的芦家渡买装备)--买黄色药材3个(买齐五色药材到洛 ...
- 第二章 数据结构 【完结】
栈那节表达式求值,并查集食物链还没做 堆,哈希表不熟,比赛的时候也很少遇到,故没有经常的练习. 目录 单链表[静态] 双链表[静态] 栈 队列 单调栈 单调队列 KMP Trie 并查集 堆 哈希表 ...
- 第二章 数据结构(一)
文章目录 链表和邻接链表 单链表 826 单链表 双链表 827 双链表 栈与队列 830 单调栈 kmp 831 kmp字符串 链表和邻接链表 数据模拟的速度会快很多,每次 new 一个新的节点,速 ...
- 斗地主AI算法——第二章の数据结构
上一章我们已经确立了基本的业务逻辑处理流程.从本章开始,我们便进入开发阶段. 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储. 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他 ...
最新文章
- 大竹中学2021高考成绩查询,四川大竹中学2021录取分数线
- Android 3.0 r1 API中文文档(113) ——SlidingDrawer
- Windows11——Modern Standby(现代待机) S0改Suspend to RAM(待机到内存)S3睡眠解决方案
- OData model instance initialization will trigger metadata load from backend
- 实现图书增删的代码_不仅仅是图书信息管理系统
- java泛型程序设计——调用遗留代码
- 前端学习(2713):重读vue电商网站33之实现首页路由重定向
- java web 来源页_Java:Java Web--分页效果
- 信奥中的数学:进位制
- HICE第四天笔记 12月8日
- thinkphp前台模板运算符
- 802d简明调试手册_802D 简明调试指南.pdf
- alter table添加表约束
- 计算机病毒进化趋势,人类进化趋势是什么?
- 严平稳随机过程,宽平稳随机过程,二阶矩过程之间的关系
- 团队作业7——Alpha冲刺之事后诸葛亮
- PGSQL分组取最新
- java getdate和getday,jq里面,如何用getDate()和getDay()函数遍历出当月的所有日子和星期?...
- 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
- 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场
热门文章
- php账号管理工具,微信公共账号第三方管理工具开发(一)
- 电子漫画系列更新10张!古老的示波器,USB hub萌妹,超级酷的焊接壁画
- java hbase 批量查询数据_java Hbase 批量读取
- 2012网易校园招聘笔试题
- SQL根据时间字段查询半小时之内或者之外的数据
- ArcGIS Pro 3.0学习版安装教程
- 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...
- Python一帮一学习小组
- 【游戏逆向】CS1.6无后坐力基址寻找
- java从入门到精通----mysql05