C++ list 带头双向链表增删查改模拟实现
前言
与 string、vector 相比,list 的实现相对复杂。主要差异如下:
1. 与 string、vector 相比
- 没有重载运算符 [] 接口:string 和 vector 底层是数组或类似结构,访问快;list 若重载效率低,故使用迭代器。
- 没有 reserve(扩容) 接口:list 每次只能插入一个数据节点,无需批量预分配空间。
- list 特有的接口:
sort():排序(底层使用归并排序),因 list 迭代器不支持随机访问减法操作,不能直接使用算法库 sort。merge():归并(针对两个有序带头双向链表)。unique():去重(针对有序带头双向链表)。remove():删除指定值的数据(不同于 erase 删除迭代器位置)。remove_if():配合仿函数删除满足条件的数据。splice():接合,将一个 list 中的数据移动到另一个 list,或调整当前 list 内部节点关系。
- 迭代器的不同:
- vector、string 使用原生指针作为迭代器,底层连续内存支持直接移动。
- list 底层非连续,需对迭代器进行包装和运算符重载以满足核心功能(解引用、++)。
一、list 底层带头双向链表验证,节点构造
1.1 节点的构造
节点包含三个变量:节点数据、下一个节点 (next)、上一个节点 (prev)。通常使用 struct 包装成员,默认公有,避免频繁使用友元。

1.2 list 底层数据结构
list 底层为带头双向链表。构造函数中会构造出一个头尾相连的哨兵位节点,成员变量主要为指向该节点的指针。
二、迭代器总结
2.1 迭代器的分类
迭代器分为输入、输出、前向、双向、随机访问等类型,支持的操作性质不同。

2.2 迭代器的实现
对于不能将原生指针作为迭代器的容器(如 list),需对迭代器进行包装。通常使用 struct 定义迭代器类,重载运算符以满足需求。
三、迭代器封装实现
3.1 前置说明
使用 struct 包装迭代器,对其使用的运算符进行重载。普通迭代器和 const 迭代器基本一致,区别在于解引用 () 和箭头 () 返回值的类型不同。















