list详解

介绍:

list是带头双向循环链表,在链表的任意位置删除插入效率高,但不能像vector一样可以通过下标随机访问每个位置的元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,

list的使用(接口)

1、构造函数

list的打印:迭代器打印。范围auto打印

2、list 的iterator(迭代器)

begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

其他一些接口:


迭代器失效:list在insert时迭代器不会失效,但在erase时迭代器会失效

list的模拟实现:

cpp 复制代码
#pragma once

#include<assert.h>
namespace bit
{
	template<class T>
		struct ListNode //构建每个链表节点
		{
			ListNode<T>* _next;
			ListNode<T>* _prev;
			T _date;

			ListNode(const T& x=T())//初始化节点
				:_next(nullptr)
				, _prev(nullptr)
				,_date(x)
			{
			}
		};
		
		template<class T>
		struct L //封装节点指针作为迭代器指针
		{
			typedef ListNode<T> Node;
			Node* _node;
			L(Node* node)
				:_node(node)
			{
				
			}

			//++it
			L& operator++()
			{
				_node = _node->_next;
				return *this;
			}
			//it++
			L& operator++(int)
			{
				L tmp = *this;
				_node = _node->_next;
				return tmp;
			}
			L& operator--()
			{
				_node = _node->_prev;
				return *this;
			}
			L& operator--(int)
			{
				L tmp = *this;
				_node = _node->_prev;
				return tmp;
			}

			T& operator*()
			{
				return _node->_date;
			}

			bool operator!=(const L& s)
			{
				return _node != s._node;
			}

				
		};


		
		
		template<class T>
		class List
		{
			typedef ListNode<T> Node;
		public:
			typedef L<T> iterator;
			iterator begin()
			{
				return iterator(_head->_next);
			}
			iterator end()
			{
				return iterator(_head);
			}
			//默认构造函数
			List()
			{
				_head = new Node;
				_head->_next = _head;
				_head->_prev = _head;
			}
			//拷贝构造
			//ist(const List<T>& lt)
				List( List<T>& lt)
			{
				_head = new Node;
				_head->_next = _head;
				_head->_prev = _head;
				for (const auto& e : lt)
				{
					push_back(e);
				}
				
			}
			//尾插
			void push_back(const T& x=T())
			{
				/*Node* newnode = new Node(x);

				Node* tail = _head->_prev;
				tail->_next = newnode;
				newnode->_prev = tail;
				newnode->_next = _head;
				_head->_prev = newnode;*/
				insert(end(), x);


			}
			//头插
			void push_front(const T& x = T())
			{
				insert(begin(), x);
				
			}

			//插入
			iterator insert(iterator pos, const T& x)
			{
				Node* cur = pos._node;
				Node* prev = cur->_prev;
				Node* newnode = new Node(x);

				prev->_next = newnode;
				newnode->_prev = prev;
				newnode->_next = cur;
				cur->_prev = newnode;
				return iterator(newnode);

			}
			//删除pos位置的节点
			iterator erase(iterator pos)
			{
				assert(pos != end());
				Node* cur = pos._node;
				Node* prev = cur->_prev;
				Node* next = cur->_next;
				prev->_next = next;
				next->_prev = prev;

				delete cur;
				return next;
			}
			//尾删
			void  pop_back()
			{
				erase(--end());
			}

			//头删
			void pop_front()
			{
				erase(begin());
			}
			void clear()
			{
				iterator it = begin();
				while (it != end())
				{
					it = erase(it);
				}
			}
			~List()
			{
				clear();
				delete _head;
				_head = nullptr;

			}
			void swap(List<T>& tmp)
			{
				std::swap(_head, tmp._head);
			}
			List<T>& operator=(List<T> lt)
			{
				swap(lt);
				/*if (this != &lt)
				{
					clear();
					for (const auto& e : lt)
					{
						push_back(e);
					}
				}*/
				return *this;
			}

		private:
			Node* _head;//一个指链表的头指针
		};

		void test_List1()
		{


			List<int> lt;
			lt.push_back(1);
			lt.push_back(1);
			lt.push_back(1);
			lt.push_back(1);
			lt.push_front(3);
			for (auto e : lt)
			{
				cout << e;
			}
			cout << endl;

			List<int> lt2;

			lt2.push_back(1);
			lt2.push_back(2);
			lt2.push_back(3);
			lt2.push_back(4);
			lt2.push_front(5);

			for (auto e : lt2)
			{
				cout << e;
			}
			cout << endl;

			lt = lt2;

			for (auto e : lt)
			{
				cout << e;
			}
			cout << endl;
			/*List<int>::iterator it = lt.end();
			while (it != lt.begin())
			{
				cout << *it;
				it--;
			}*/

			//for (auto e : lt)
			//{
			//	cout << e;
			//}
			//cout << endl;
			//lt.clear();
			


		}

}
相关推荐
Fanxt_Ja17 小时前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
今后12318 小时前
【数据结构】二叉树的概念
数据结构·二叉树
凯子坚持 c18 小时前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list
第七序章1 天前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
散1121 天前
01数据结构-01背包问题
数据结构
消失的旧时光-19431 天前
Kotlinx.serialization 使用讲解
android·数据结构·android jetpack
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步
苏小瀚1 天前
[数据结构] 排序
数据结构
睡不醒的kun1 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌1 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode