一、链表

链表是一种数据结构。
链表有一个“头指针”变量,以head表示,只要有头指针就可以得到这条链表的所有信息。它不存储数据只存放一个地址,该地址指向下一个元素。
链表中每一个元素称为“结点”,每个结点都应包括两个部分:

  1. 数据域:用户需要用的实际数据
  2. 指针域:存放下一个结点的地址

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链表相关推荐

  1. STL学习——Slist篇

    STL学习--Slist篇 简介 STL中List是双向链表,而Slist是单向链表.它们的区别:Slist的迭代器是单向的Forward Iterator,而list的迭代器是双向的Bidirect ...

  2. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  3. 数据结构思维 第五章 双链表

    第五章 双链表 原文:Chapter 5 Doubly-linked list 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章回顾了上一个练习的结果,并介绍了List接口的 ...

  4. STL源码剖析 slist单向链表概述

    概述 SGI STL的list是一个双向链表,单向链表是slist,其不在标准规格之内 单向和双向链表的区别在于,单向链表的迭代器是单向的 Forward Iterator,双向链表的迭代器属于双向的 ...

  5. STL浅谈(2)——链表+相应迭代器实现

    一开始看STL源码是从列表开始的,上一遍博文对于栈的实现是没有迭代器加入的.这里加入了迭代器,所以稍微有点复杂.从list开始只是觉得之前对列表有比其他容器更好的理解.实现的过程中当然也遇到问题,这里 ...

  6. 数据结构实验之链表五:单链表的拆分_JAVA

    Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. Input 第 ...

  7. 数据结构实验之链表五:单链表的拆分

    Description 输入N个整数顺序建立一个单链表,将该单链表拆分成两个子链表,第一个子链表存放了所有的偶数,第二个子链表存放了所有的奇数.两个子链表中数据的相对次序与原链表一致. Input 第 ...

  8. 牛客网(剑指offer) 第二十五题 复杂链表的复制

    //题目描述 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点 ...

  9. 牛客网(剑指offer) 第十五题 反转链表

    //题目描述:输入一个链表,反转链表后,输出该链表的所有元素. <?php /*class ListNode{var $val;var $next = NULL;function __const ...

最新文章

  1. Vue之Todolist案例和ES6语法
  2. 5篇CVPR 各路大佬显身手 点云分割、姿态估计、物体检测、生成重建
  3. SAP MM 价格重估产生的差异
  4. 探讨微软团队开发利器VSTS之安装及部署篇
  5. CentOS 5升级Python版本(2.42.7)
  6. 《Python Cookbook 3rd》笔记(2.10):在正则式中使用 Unicode
  7. shell实战训练营Day1
  8. Ubuntu 16.04使用sudo apt-get -f install解决依赖时的注意事项(重点)
  9. 能识别nvme的pe启动_学用系列|Mathpix,送给理科老师们的公式识别神器
  10. android 2048 游戏 源码
  11. 易班自动答题脚本_自动答题脚本教程及源码分享(无视分辨率)
  12. 【BZOJ1106】【POI2007】立方体大作战tet(树状数组+贪心)
  13. Everything使用攻略和技巧
  14. 高级Java程序员必备:《IDEA问题库》常见问题及解决方案,提升开发效率(JAVA 小虚竹)
  15. modbus模拟器使用
  16. oracle lsnrctl status unknown,理解 oracle 的 lsnrctl status
  17. html代码表格服装尺寸,HTML - 表格单元尺寸
  18. 域名指向变更后,域名依旧指向老IP问题
  19. (转载)shell脚本中的 EOF 是什么意思?
  20. 哪些平台可以查看医学类文献?

热门文章

  1. HTML5 classList使用
  2. 使用java 遍历文件夹
  3. 关于Windows azure从github上部署项目
  4. [Node.js] mySQL数据库 -- 数据库的基本操作
  5. 开始深入的学习javascript
  6. 【ES6】对象、函数、数组的扩展
  7. JavaScript学习笔记之DOM篇,带你全面了解什么是DOM
  8. TensorFlow2.0(七)--基础API使用
  9. Linux基础(2)--Linux常用shell命令
  10. linux下拷贝文件的时候出现权限不够,如何解决