事先声明: 本人纯小白 如有错误 敬请各位大佬指正
C++ 标准库自带了 std::list 这样一个双向链表 ,在日常写题过程中可以很方便的使用 (主要是懒) (xiao
关于 list 自带的一个一些 常用成员函数:
首先
list <类型> ::iterator
是一个list类型的迭代器(相当于指针,用来遍历表十分方便)
begin()
第一个元素的迭代器
end()
最后一个元素后面一个位置的迭代器(不指向最后一个元素)
push_back(值);
把值插入到表尾
push_front(值);
把值插入到表头
pop_back();
删除表尾元素
pop_front();
删除表头元素
insert(迭代器,值);
在迭代器的前一个位置插入值
erase(迭代器);
删除该迭代器指向的元素(注意:删除之前需判断该元素是否存在或者之前已经被删除过了(后面会讲))特别的:
list 还有一些特殊的成员函数
sort()
这个sort是成员函数 按升序排列 (注意:sort(mylist.begin(),mylist.end())) 是错误写法
unique()
去重函数 使用规则同上
list 遍历的两种方式
//list 的两种遍历方法 个人还是喜欢后一种 因为比较短 但后一种也有缺陷
#include<list>
using namespace std;
list<int> mylist; //初始化链表
//通过迭代器遍历链表
for(auto it =mylist.begin();it!=mylist.end();it++)
cout<<*it<<" ";
//通过智能指针遍历链表 C++11特性
for(auto &x :mylist)
cout<<x<<" ";
练习:
P1160 队列安排 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC 代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <list>
using namespace std;
const int N =1e5+10;
list <int > l;
list<int> ::iterator pos[N]; //存放第 k元素插入的位置
int n,m;
bool erz[N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); //C++ 输入输出加速
cin>>n;
l.push_front(1); //首先放入第一个元素
pos[1]=l.begin(); //放入第一个元素
for(int i=2;i<=n;i++){
int k,p;cin>>k>>p;
// insert() 默认会在迭代器左边插入
if(p==1) pos[i]=l.insert(next(pos[k]),i); //在第k个元素右边插入
else pos[i]=l.insert(pos[k],i); //在第k元素左边插入
}
cin>>m;
while(m--){ //删除操作
int k;cin>>k;
if(!erz[k]){ //判断这个元素有没有删除 若已经删除就不删除了
l.erase(pos[k]);
erz[k]=true;
}
}
for(auto &y:l){ //最后打印输出整个链表
cout<<y<<" ";
}
return 0;
}