1. list_node 的结构
1.1 list_node 结构体
list 基于双向循环链表结构,节点初始化定义如下:
_next:指向链表中下一个节点的指针_prev:指向链表中上一个节点的指针_val:存储节点的值
构造函数 list_node(const T& val = T()) 用于初始化节点,将 _next 和 _prev 指针默认设置为 nullptr,并将 _val 初始化为传入的值。
struct list_node {
list_node<T>* _next;
list_node<T>* _prev;
T _val;
list_node(const T& val = T()) :_next(nullptr), _prev(nullptr), _val(val) {}
};
在类内部进行类型别名定义:
class list {
public:
typedef list_node<T> Node;
typedef _list_iterator<T, T&, T*> iterator;
typedef _list_iterator<T, const T&, const T*> const_iterator;
};
typedef list_node<T> Node;:简化链表节点类型的书写。typedef _list_iterator<T, T&, T*> iterator;:定义普通迭代器类型,解引用后返回引用和指针。typedef _list_iterator<T, const T&, const T*> const_iterator;:定义常量迭代器类型,保证遍历 const list 时不能修改元素值。
1.2 list 和 list_node 分离设计原因
将 list_node 结构体和 list 类分离设计,体现了'数据存储'与'逻辑管理'分离的思想。
-
职责分离,符合单一职责原则
list_node结构体仅负责存储单个节点的数据和连接关系(前驱_prev、后继_next指针),作为链表的最小数据单元。list类负责管理整个链表的逻辑,包括节点的创建/销毁、插入/删除、遍历、容量管理等操作。它不直接存储数据,而是通过操作list_node对象来实现整体功能。- 这种分离让代码更清晰,便于维护和扩展。
-
封装性更好,隐藏实现细节
list_node通常是list类的内部私有类型,外部用户不需要知道节点的具体结构。


