一、List概述
需要头文件#include <list>
list容器是用来构造一个链表的,而且构造的链表是双向的(即val数据域,next指针和prve指针)。用List构造的链表有一个虚拟头节点,并且链表最后一个结点的next指针指向虚拟头节点,虚拟头节点的prve指针指向最后一个结点,也就是循环双向链表。
list中还有两个迭代器,即begin()和end(),例如list<inr> l; l.begin()就是虚拟头节点,而l.end()就是尾结点。
二、List容器的基本操作
1、初始化:
list<数据类型> 数据名;
当不做赋值操作时,list为空
2、初始化赋值操作:
显性赋值:list<int> l={1,2,3,4,5};
隐性赋值:list<int> l({1,2,3,4,5});
//以上两种操作结果相同;
已经用List创建了一个链表,并且想创建一个新的链表与原链表相同时:
list<int> l2(l1.begin(),l1.end()); //此时l1和l2相同
全零初始化:list<int> l(想要为零的个数); //例如list<int> l(8);
有值初始化:list<int> l(初始化个数,初始化数字); //例如list<int> l(8,6);
拷贝构造函数:list<int> l(与l相同的List对象);//例如list<int> l(l1);
三、赋值操作
假设l={9,8,5,2,1,1};
“=”赋值:List<int> l1; l1=l;
assign赋值:assign(迭代器):list<int> l2; l2.assign(l.begin(),l.end());
assign有两种初始化方式:
初始化列表:list<int> l3; l3.assign({1,3,1,4});
初始化a个b:list<int> l4; l4.assign(a,b);
四、List大小操作
empty:list判空操作,空为1,不空为0。
size:list大小判断,l.size()输出链表大小;
resize:list补充,保留原List中的数据,将未满足数量的数据初始化为0;
例如:list<int> l;
l.assign({1,2,3});
l.resize(18);
最终输出:1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
//resize也支持初始化不为零的数,resize(数据数量,数据值),最终为保持前面的不变,后面初始化为相应的值。
当resize扩大的数据量小于原链表,则会减少为相应数量。
五、数据插入
1、push_front:头插
头插法相当于逆序建表,例如l.push_front(1);
l.push_front(2);
l.push_front(3);
最终输出:3 2 1
2、push_back:尾插
尾插法相当于顺序建表,例如l.push_front(1);
l.push_front(2);
l.push_front(3);
最终输出:1 2 3
3、insert:中间插
方法一:insert(迭代器,值); 即在迭代器所在的位置插入一个值。
迭代器:list<int>::iterator it=l.begin(); 此时可以it++,但不能it=it+1;(链表不支持随机访问,有可能你不会加1)
如果迭代器是begin+3,则插在第四个位置,相当于l[3];
方法二:insert(迭代器,数量,值); 在迭代器插入一定数量的值。
方法三:insert(迭代器,迭代器的开始位置,迭代器的结束位置);例如
list<int> l={1,2,3};
it=l.begin();
it++;
insert(it,l.begin(),l.end());
最终输出:1 1 2 3 2 3 (蓝色部分就是l起始位置到终止位置的拷贝)
六、数据删除
list<int> l={1,2,3};
1、pop_front:头删;
例如:l.pop_front(); 输出 2 3
2、pop_back:尾删;
例如:l.pop_back():输出 1 2
3、erase:中间删;
有两种形式:
l.erase(迭代器);//注意,这个有返回值,可以用一个迭代器接住,迭代器指向第一个数。
l.erase(开始的迭代器,结束的迭代器);
例如list<int>::iterator it=l.rease(l.begin());
(蓝色字体可以认为是链表类型的数据类型,相当于对于整数类型的int)
或者 it=erase(it);
4、clear:全部清除;
七、数据访问
list<int> l={1,2,3};
//List无法进行随机访问,效率低,所以数组方式或者at方式都不行;
所以,只能从头开始一个一个去寻找。
定义链表类型的迭代器list<int> ::iterator it=l.begin();通过 it++ 来寻找符合题意的数据。
八、链表反转
l.reverse(); 直接实现链表内部的反转。