STL(五)——slist/list链表
一、链表
链表是一种数据结构。
链表有一个“头指针”变量,以head表示,只要有头指针就可以得到这条链表的所有信息。它不存储数据只存放一个地址,该地址指向下一个元素。
链表中每一个元素称为“结点”,每个结点都应包括两个部分:
- 数据域:用户需要用的实际数据
- 指针域:存放下一个结点的地址
head指向第一个元素,第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束,单链表示意图如下:
二、slist/list
slist/list是STL对于链表的一种实现。
slist:迭代器属于单向的Forward Iterator(可读写)。
list :迭代器属于双向的Bidirectional Iterator(可以双向读写)。
看起来slist的功能应该会不如list,但由于其单向链表的实现,其消耗的空间更小,某些操作更快。
这里重点介绍list,双向链表示意图如下:
1、list的构造函数
list<int>a{1,2,3}
list<int>a(n) //声明一个n个元素的列表,每个元素都是0
list<int>a(n, m) //声明一个n个元素的列表,每个元素都是m
2、push_back()和push_front()
插入一个元素到list中
push_back():从list的末端插入(尾插)
push_front():从list的头部插入。(头插)
调用list容器的成员函数begin():得到一个指向容器起始位置的iterator可以调用list容器的end()函数:得到list末端下一位置
3、clear()
清空list中的所有元素
4、front()和back(),pop_back()和pop_front()
front():获得list容器中的头部元素
back():获得list容器的最后一个元素
pop_back():删掉尾部第一个元素
pop_front():删掉头部第一个元素
链表为空时调用不会报错,故最好先调用empty()函数判断。
5、reverse()
可以实现list的逆置
6、insert()
在指定位置插入一个或多个元素
a.insert(a.begin(),100); //在a的开始位置(即头部)插入100
a.insert(a.begin(),2, 100); //在a的开始位置插入2个100
7、erase()
用迭代器遍历删除,执行后it会指向下一个元素。
list<int>::iterator it;
for(it = List.begin(); it != List.end() ; ) {it = List.erase(it); //it指向了下一个元素
}
8、实现首尾相连的环形
list<int> l;
list<int>::iterator it;
for (it = l.begin(); ;it++) {if (it == l.end())//如果迭代器==end(),就将it置于begin()it = l.begin();
}
三、例题
HDOJ-1276士兵队列训练问题
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
#include<bits/stdc++.h>
using namespace std;
#define fio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int main() {fio int n, m;cin >> n;while (n--) {list<int> l;list<int>::iterator it;cin >> m;for (int i = 1; i <= m; i++)l.push_back(i);//注意插入链表操作的关键词int flag = 2, count;while (l.size() > 3) { count = 1;//报数每次由1开始for (it = l.begin(); it != l.end(); ) {if (count++ % flag == 0) it = l.erase(it);//执行后迭代器自动指向下一个元素,故需要“it=”else it++;}flag == 2 ? flag = 3: flag = 2;//2、3交替轮流进行}for (it = l.begin(); it != l.end(); it++) {if (it != l.begin()) {cout << " ";}cout << *it; }cout <<endl;}
}
STL(五)——slist/list链表相关推荐
- STL学习——Slist篇
STL学习--Slist篇 简介 STL中List是双向链表,而Slist是单向链表.它们的区别:Slist的迭代器是单向的Forward Iterator,而list的迭代器是双向的Bidirect ...
- 数据结构实验之链表五:单链表的拆分-sdut
数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...
- 数据结构思维 第五章 双链表
第五章 双链表 原文:Chapter 5 Doubly-linked list 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章回顾了上一个练习的结果,并介绍了List接口的 ...
- STL源码剖析 slist单向链表概述
概述 SGI STL的list是一个双向链表,单向链表是slist,其不在标准规格之内 单向和双向链表的区别在于,单向链表的迭代器是单向的 Forward Iterator,双向链表的迭代器属于双向的 ...
- STL浅谈(2)——链表+相应迭代器实现
一开始看STL源码是从列表开始的,上一遍博文对于栈的实现是没有迭代器加入的.这里加入了迭代器,所以稍微有点复杂.从list开始只是觉得之前对列表有比其他容器更好的理解.实现的过程中当然也遇到问题,这里 ...
- 数据结构实验之链表五:单链表的拆分_JAVA
Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. Input 第 ...
- 数据结构实验之链表五:单链表的拆分
Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. Input 第 ...
- 牛客网(剑指offer) 第二十五题 复杂链表的复制
//题目描述 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点 ...
- 牛客网(剑指offer) 第十五题 反转链表
//题目描述:输入一个链表,反转链表后,输出该链表的所有元素. <?php /*class ListNode{var $val;var $next = NULL;function __const ...
最新文章
- Vue之Todolist案例和ES6语法
- 5篇CVPR 各路大佬显身手 点云分割、姿态估计、物体检测、生成重建
- SAP MM 价格重估产生的差异
- 探讨微软团队开发利器VSTS之安装及部署篇
- CentOS 5升级Python版本(2.42.7)
- 《Python Cookbook 3rd》笔记(2.10):在正则式中使用 Unicode
- shell实战训练营Day1
- Ubuntu 16.04使用sudo apt-get -f install解决依赖时的注意事项(重点)
- 能识别nvme的pe启动_学用系列|Mathpix,送给理科老师们的公式识别神器
- android 2048 游戏 源码
- 易班自动答题脚本_自动答题脚本教程及源码分享(无视分辨率)
- 【BZOJ1106】【POI2007】立方体大作战tet(树状数组+贪心)
- Everything使用攻略和技巧
- 高级Java程序员必备:《IDEA问题库》常见问题及解决方案,提升开发效率(JAVA 小虚竹)
- modbus模拟器使用
- oracle lsnrctl status unknown,理解 oracle 的 lsnrctl status
- html代码表格服装尺寸,HTML - 表格单元尺寸
- 域名指向变更后,域名依旧指向老IP问题
- (转载)shell脚本中的 EOF 是什么意思?
- 哪些平台可以查看医学类文献?