list介绍
list是一个双向循环链表,双向循环链表它的每个节点都有两个链接,一个指向前一个节点,另一个指向下一个节点,且最后一个结点指向头节点。
结点组成
1.数据域
2.指针域 :有两个指针域,一个指向前一个结点,一个指向后一个结点
优点
1.相比于单向链表,双向链表在插入和删除操作时更加灵活,因为它们可以从两个方向进行操作;
2.相比于序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
缺点
1.最大的缺陷是不支持任意位置的随机访问,必须从已知的位置(比如头部或者尾部)迭代到该位置;
2.需要额外的指针来维护前一个和下一个节点的链接。
list使用
list的初始化
与vector相同,使用时要包含list头文件;声明是容器类型 <数据类型>name;
vector <int>arr;//定义了一个空的数组 list <int>mylist;//定义一个空的双向循环链表
其他初始化方式还有
list<int>mylist(2,3);//定义一个里面有两个三的双向循环链表 list<int>mylist1(mylist)//用mylist初始化mylist1 list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2
其他函数
empty()——判空
检测list是否为空,是返回true,否则返回false
#include<iostream> #include<list> using namespace std; int main() { list<int>list1; list<int>mylist(2, 3); list<int>mylist1(mylist); cout << "检测链表是否为空list1——" << list1.empty() << endl; cout << "检测链表是否为空mylist——" << mylist.empty() << endl; return 0; }
size()——数据个数
返回list中有效节点的个数
#include<iostream> #include<list> using namespace std; int main() { list<int>list1; list<int>mylist(2, 3); list<int>mylist1(mylist); cout << "list1数据个数——" << list1.size() << endl; cout << "mylist数据个数——" << mylist.size() << endl; return 0; }
front()——第一个数据
返回list的第一个节点中值的引用
#include<iostream> #include<list> using namespace std; int main() { list<int>list1; list<int>mylist(2, 3); list<int>mylist1(4, 7); cout << "mylist第一个数据——" << mylist.front() << endl; cout << "mylist1第一个数据——" << mylist1.front() << endl; return 0; }
back()—— 最后一个数据
返回list的最后一个节点中值的引用
#include<iostream> #include<list> using namespace std; int main() { list<int>list1; list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 list<int>mylist1 = { 3, 4 };//同上 cout << "mylist最后一个数据——" << mylist.back() << endl; cout << "mylist1最后一个数据——" << mylist1.back() << endl; return 0; }
push_front(int val)——前插
在list首元素前插入值为val的元素
#include<iostream> #include<list> using namespace std; int main() { list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 cout << "push_front()前mylist第一个数据——" << mylist.front() << endl; mylist.push_front(1); cout << "push_front()后mylist第一个数据——" << mylist.front() << endl; return 0; }
pop_front()——前删
删除list中第一个元素
#include<iostream> #include<list> using namespace std; int main() { list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 cout << "pop_front()前mylist第一个数据——" << mylist.front() << endl; mylist.pop_front(); cout << "pop_front()后mylist第一个数据——" << mylist.front() << endl; return 0; }
push_back(int val)——尾插
在list尾部插入值为val的元素
#include<iostream> #include<list> using namespace std; int main() { list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 cout << "push_back()前mylist最后一个数据——" << mylist.back() << endl; mylist.push_back(1); cout << "push_back()后mylist最后一个数据——" << mylist.back() << endl; return 0; }
pop_back()——尾删
删除list中最后一个元素
#include<iostream> #include<list> using namespace std; int main() { list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 cout << "pop_back()前mylist最后一个数据——" << mylist.back() << endl; mylist.pop_back(); cout << "pop_back()后mylist最后一个数据——" << mylist.back() << endl; return 0; }
clear()——清空
清空list中的有效元素
#include<iostream> #include<list> using namespace std; int main() { list<int>mylist = { 3, 2 };//代表列表里面有两个数第一个3,第二个2 cout << "clear()前——检测链表是否为空mylist——" << mylist.empty() << endl; mylist.clear(); cout << "clear()后——检测链表是否为空mylist——" << mylist.empty() << endl; return 0; }