写在前面:链表这一部分完结,我觉得链表最重要的还是根据题目来写代码(数组模拟指针),可能是大二上已经学过应试版数据结构的缘故吧。最后,还是希望自己能够持之以恒,在寒假完成算法基础课。(最近几天都睡到了上午11点,太颓废了5555)

目录

一、单链表

1、基础知识

2、AcWing 826

二、双链表

1、AcWing 827


一、单链表

1、基础知识

做算法题时,主要使用数组来模拟链表(原因是快)。

如果使用指针和new来操作链表,时间效率太低,对于多数题目都会超时。

e[i]表示下标 i 的点的值域,ne[i]表示下标 i 的点的指针域。

2、AcWing 826

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

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

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

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

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

  1. H x,表示向链表头插入一个数 x。
  2. D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。
  3. 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 种操作:

  1. 在最左侧插入一个数;
  2. 在最右侧插入一个数;
  3. 将第 k 个插入的数删除;
  4. 在第 k 个插入的数左侧插入一个数;
  5. 在第 k 个插入的数右侧插入一个数

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

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

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

  1. L x,表示在链表的最左端插入数 x。
  2. R x,表示在链表的最右端插入数 x。
  3. D k,表示将第 k 个插入的数删除。
  4. IL k x,表示在第 k 个插入的数左侧插入一个数。
  5. 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_第二章 数据结构(一)_链表相关推荐

  1. yxc_第二章 数据结构(一)_栈和队列

    目录 一.栈和队列的代码操作 1.AcWing 828 模拟栈 2.AcWing 829 模拟队列 二.单调栈 1.AcWing 830 单调栈 三.单调队列 1.AcWing 154 滑动窗口 一. ...

  2. yxc_第二章 数据结构(二)_Trie树

    目录 一.基本概念 二.AcWing 835 Trie字符串统计 本题思路: 一.基本概念 接下来的案例类似于邻接矩阵,横轴表示str[ i ] - 'a'(省略了7~25),竖轴表示节点编号.红色的 ...

  3. yxc_第二章 数据结构(一)_kmp算法

    目录 一.思路 二.AcWing 831 KMP字符串 三.时间复杂度 一.思路 当子串P与模式串S匹配一部分时,在两个串的接下来的一个元素不相同,而在已经匹配成功的串中存在前缀等于后缀.此时后缀最后 ...

  4. 第二章简答_微观 第二章 效用论

    第二章 效用论 效用论分为基数效用论和序数效用论 基数效用论:效用可以用基数数字来表示. 序数效用论:效用无法用数字表示,只能根据满足程度的大小进行排序. 一.基数效用论 1.效用(名词解释):指消费 ...

  5. Java天之痕第二章攻略_轩辕剑参外传:天之痕主线详细攻略大全

    本文小编为您带来轩辕剑参外传:天之痕主线详细攻略大全,至于这次的游戏,在战斗方面基本没有什么难度,只要稍微注意一下属性相克就可以了. 玩家在游戏初期可以得到一只符鬼,你必须选择它的属性.共有金.木.水 ...

  6. Java天之痕第二章攻略_轩辕剑参外传天之痕第二章怎么过 通关图文攻略

    刚刚给大家介绍了一下第一章的图文攻略,现在给大家说下第二章,在第二章的剧情里面,我们来到黑山镇,具体的剧情攻略如下: 到北方的黑山镇(可以先去东南方的芦家渡买装备)--买黄色药材3个(买齐五色药材到洛 ...

  7. 第二章 数据结构 【完结】

    栈那节表达式求值,并查集食物链还没做 堆,哈希表不熟,比赛的时候也很少遇到,故没有经常的练习. 目录 单链表[静态] 双链表[静态] 栈 队列 单调栈 单调队列 KMP Trie 并查集 堆 哈希表 ...

  8. 第二章 数据结构(一)

    文章目录 链表和邻接链表 单链表 826 单链表 双链表 827 双链表 栈与队列 830 单调栈 kmp 831 kmp字符串 链表和邻接链表 数据模拟的速度会快很多,每次 new 一个新的节点,速 ...

  9. 斗地主AI算法——第二章の数据结构

    上一章我们已经确立了基本的业务逻辑处理流程.从本章开始,我们便进入开发阶段. 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储. 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他 ...

最新文章

  1. 大竹中学2021高考成绩查询,四川大竹中学2021录取分数线
  2. Android 3.0 r1 API中文文档(113) ——SlidingDrawer
  3. Windows11——Modern Standby(现代待机) S0改Suspend to RAM(待机到内存)S3睡眠解决方案
  4. OData model instance initialization will trigger metadata load from backend
  5. 实现图书增删的代码_不仅仅是图书信息管理系统
  6. java泛型程序设计——调用遗留代码
  7. 前端学习(2713):重读vue电商网站33之实现首页路由重定向
  8. java web 来源页_Java:Java Web--分页效果
  9. 信奥中的数学:进位制
  10. HICE第四天笔记 12月8日
  11. thinkphp前台模板运算符
  12. 802d简明调试手册_802D 简明调试指南.pdf
  13. alter table添加表约束
  14. 计算机病毒进化趋势,人类进化趋势是什么?
  15. 严平稳随机过程,宽平稳随机过程,二阶矩过程之间的关系
  16. 团队作业7——Alpha冲刺之事后诸葛亮
  17. PGSQL分组取最新
  18. java getdate和getday,jq里面,如何用getDate()和getDay()函数遍历出当月的所有日子和星期?...
  19. 【tensorflow 读取图片方式】本地文件名读取以及url方式读取
  20. 【Visual C++】游戏开发笔记四十 浅墨DirectX教程之八 绘制真实质感的三维世界 光照与材质专场

热门文章

  1. php账号管理工具,微信公共账号第三方管理工具开发(一)
  2. 电子漫画系列更新10张!古老的示波器,USB hub萌妹,超级酷的焊接壁画
  3. java hbase 批量查询数据_java Hbase 批量读取
  4. 2012网易校园招聘笔试题
  5. SQL根据时间字段查询半小时之内或者之外的数据
  6. ArcGIS Pro 3.0学习版安装教程
  7. 【总结】最好的CV学习小组,超200个课时+10个方向+30个项目,从理论到实践全部系统掌握...
  8. Python一帮一学习小组
  9. 【游戏逆向】CS1.6无后坐力基址寻找
  10. java从入门到精通----mysql05