#pragma once #include #include using namespace std; namespace Lenyiin { template struct __list_node { __list_node *_next; // 指向后一个节点的指针 __list_node *_prev; // 指向前一个节点的指针 T _data; // 节点存储的数据 __list_node(const T &data = T()) : _data(data), _next(nullptr), _prev(nullptr) { } }; template struct __list_iterator { typedef __list_node Node; typedef __list_iterator Self; Node *_node; // 默认构造 __list_iterator(Node *node) : _node(node) { } // 运算符重载 // *it Ref operator*() { return _node->_data; } // it -> Ptr operator->() { return &_node->_data; } // ++it Self &operator++() { _node = _node->_next; return *this; } // it++ Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } // --it Self &operator--() { _node = _node->_prev; return *this; } // it-- Self operator--(int) { Self tmp(*this); --(*this); return tmp; } // it != end() bool operator!=(const Self &it) { return _node != it._node; } bool operator==(const Self &it) { return _node == it._node; } }; template struct __list_reverse_iterator { typedef __list_node Node; typedef __list_reverse_iterator Self; Node *_node; // 默认构造 __list_reverse_iterator(Node *node) : _node(node) { } // 运算符重载 // *it Ref operator*() { return _node->_data; } // it -> Ptr operator->() { return &_node->_data; } // ++it Self &operator++() { _node = _node->_prev; return *this; } // it++ Self operator++(int) { Self tmp(*this); ++(*this); return tmp; } // --it Self &operator--() { _node = _node->_next; return *this; } // it-- Self operator--(int) { Self tmp(*this); --(*this); return tmp; } // it != end() bool operator!=(const Self &it) { return _node != it._node; } bool operator==(const Self &it) { return _node == it._node; } }; template class List { typedef __list_node Node; public: typedef __list_iterator iterator; typedef __list_iterator const_iterator; typedef __list_reverse_iterator reverse_iterator; typedef __list_reverse_iterator const_reverse_iterator; iterator begin() // 返回头节点的下一个节点 { return iterator(_head->_next); } iterator end() // 返回头节点 { return iterator(_head); } const_iterator begin() const { return const_iterator(_head->_next); } const_iterator end() const { return const_iterator(_head); } reverse_iterator rbegin() // 返回头节点的下一个节点 { return reverse_iterator(_head->_prev); } reverse_iterator rend() // 返回头节点 { return reverse_iterator(_head); } const_reverse_iterator rbegin() const { return const_reverse_iterator(_head->_prev); } const_reverse_iterator rend() const { return const_reverse_iterator(_head); } public: // 带头双向循环链表 // 默认构造 List() { _head = new Node; _head->_next = _head; _head->_prev = _head; } // 拷贝构造 List(const List <) { _head = new Node; _head->_next = _head; _head->_prev = _head; for (const auto &e : lt) { push_back(e); } } // 赋值运算符 // List& operator=(const List& lt) //{ // if (this != <) // { // clear(); // for (const auto& e : lt) // { // push_back(e); // } // } // return *this; //} // 进阶写法 List &operator=(List lt) { std::swap(_head, lt._head); return *this; } // 清除 void clear() { iterator it = begin(); while (it != end()) { erase(it++); } } // 析构函数 ~List() { clear(); delete _head; _head = nullptr; } // 结构设计的优势, 有没有数据, 插入的逻辑都是一样的 // void push_back(const T& data) //{ // Node* tail = _head->_prev; // Node* newnode = new Node(data); // tail->_next = newnode; // newnode->_prev = tail; // newnode->_next = _head; // _head->_prev = newnode; //} // void push_front(const T& data) //{ // Node* cur = _head->_next; // Node* newnode = new Node(data); // _head->_next = newnode; // newnode->_prev = _head; // newnode->_next = cur; // cur->_prev = newnode; //} void push_back(const T &data) { insert(end(), data); } void push_front(const T &data) { insert(begin(), data); } // void pop_back() //{ // Node* tail = _head->_prev; // Node* prev = tail->_prev; // delete tail; // prev->_next = _head; // _head->_prev = prev; //} // void pop_front() //{ // Node* head = _head->_next; // Node* next = head->_next; // delete head; // _head->_next = next; // next->_prev = _head; //} void pop_back() { erase(--end()); } void pop_front() { erase(begin()); } void insert(iterator pos, const T &data) { Node *cur = pos._node; Node *prev = cur->_prev; Node *newnode = new Node(data); // prev newnode cur prev->_next = newnode; newnode->_prev = prev; newnode->_next = cur; cur->_prev = newnode; } iterator erase(iterator pos) { assert(pos != end()); Node *cur = pos._node; Node *prev = cur->_prev; Node *next = cur->_next; delete cur; prev->_next = next; next->_prev = prev; return next; } private: Node *_head; }; }