一、链表本质与实现原理
1.1 数据结构特性
STL list是典型的双向链表实现,每个节点包含:
- 数据域:存储实际元素
- 前驱指针:指向前一个节点
- 后继指针:指向后一个节点
// 节点结构伪代码
template <typename T>
struct __list_node {
__list_node* prev;
__list_node* next;
T data;
};
1.2 内存布局图示
┌───────────┐ ┌───────────┐ ┌───────────┐
│ prev │ │ prev │ │ prev │
├───────────┤ ├───────────┤ ├───────────┤
│ next │ →→ │ next │ →→ │ next │
├───────────┤ ├───────────┤ ├───────────┤
│ data │ │ data │ │ data │
└───────────┘ └───────────┘ └───────────┘
1.3 迭代器设计
双向链表迭代器是Bidirectional Iterator,支持++和–操作:
template <typename T>
struct __list_iterator {
__list_node<T>* node;
// 前置++操作
__list_iterator& operator++() {
node = node->next;
return *this;
}
// 前置--操作
__list_iterator& operator--() {
node = node->prev;
return *this;
}
};
二、核心操作与使用技巧
2.1 基础操作示例
#include <list>
// 初始化方式
std::list<int> lst1 = {
1, 3, 5}; // 初始化列表
std::list<std::string> lst2(10); // 10个空字符串
// 高效插入操作
lst1.splice(lst1.end(), lst2); // O(1)时间合并
lst2.insert(lst2.begin(), {
"A", "B"});// 批量插入
// 特殊删除操作
lst1.remove_if([](int x){
return x%2==0; }); // 条件删除
2.2 高级特性
节点转移操作(C++11+):
std::list<int> src = {
1,2,3};
std::list<int> dst;
auto it = src.begin