c++实现双向链表

typedef int DataType; 

struct ListNode 
{ 
	ListNode* _next; 
	ListNode* _prev; 
	DataType _data;

	ListNode(DataType x)
		:_next(NULL)
		,_prev(NULL)
	    ,_data(x)
	{}
}; 

class List 
{ 
	typedef ListNode Node; 
public: 
	List()
		:_head(NULL)
		,_tail(NULL)
	{}
	List(const List& l)
		:_head(NULL)
		,_tail(NULL)
	{
		if(l._head == NULL)
		{
			return;
		}
		Node* tmp = l._head;
		do 
		{
			PushBack(tmp->_data);
			tmp = tmp->_next;
		} while (tmp);
	}
	List& operator=(const List& l)
	{
		List l1(l);
		Swap(l1);
		return *this;

	}
	~List()
	{
		if(_head == _tail)
		{
			delete _head;
			_head = _tail =NULL;
		}
		else
		{
			Node* tmp = _head;
			while(tmp)
			{
				Node* del = tmp;
				tmp = tmp->_next;
				delete del;
			}
			_head = _tail = NULL;
		}
	};
	void Swap(List& l)
	{
		swap(_head,l._head);
		swap(_tail,l._tail);
	}
	void PushBack(DataType x)
	{
		//无节点
		if(_head == NULL)
		{
			_head = new Node(x);
			_tail = _head;
		}
		else//有节点
		{
			Node* tmp = new Node(x);
			Node* prev = _tail;
			prev->_next = tmp;
			tmp->_prev = prev;
			_tail = tmp;

		}
	}
	void PopBack()
	{
		//无节点
		if (_head == NULL)
		{
			cout<<"List is empty"<<endl;
			return;
		}
		//1个节点
		if (_head == _tail)
		{
			delete _head;
			_head = _tail =NULL;
			return;
		}
		//多个节点
		Node* prev = _tail->_prev;
		Node* del = _tail;
		delete del;
		_tail = prev;
		_tail->_next = NULL;
	}
	void PushFront(DataType x)
	{
		//无节点
		if(_head == NULL)
		{
			_head = new Node(x);
			_tail = _head;
		}
		else//有节点
		{
			Node* NewNode = new Node(x);
			Node* tmp = _head;
			NewNode->_next = tmp;
			tmp->_prev = NewNode;
			_head = NewNode;
		}
	}
	void PopFront()
	{
		//无节点
		if (_head == NULL)
		{
			cout<<"List is empty"<<endl;
			return;
		}
		//1个节点
		if (_head == _tail)
		{
			delete _head;
			_head = _tail =NULL;
			return;
		}
		//多个节点
		Node* tmp = _head->_next;
		Node* del = _head;
		delete del;
		_head = tmp;
		_head->_prev = NULL;
	}
	
	// 在pos的前面插入一个 
	void Insert(Node* pos, DataType x)
	{
		assert(pos);
		if(pos == _head)
		{
			PushFront(x);
		}
		else
		{
			Node* prev = pos->_prev;
			Node* cur = new Node(x);
			prev->_next = cur;
			cur->_prev = prev;
			cur->_next = pos;
			pos->_prev = cur;
		}
	}
	void Erase(Node* pos)
	{
		if(pos == _head)
		{
			PopFront();
		}
		else if(pos == _tail)
		{
			PopBack();
		}
		else
		{
			Node* prev = pos->_prev;
			Node* next = pos->_next;
			Node* del = pos;
			prev->_next = next;
			next->_prev = prev;
			delete del;
		}
	}
	Node* Find(DataType x)
	{
		Node* tmp = _head;
		while(tmp)
		{
			if(tmp->_data == x)
			{
				return tmp;
			}
			tmp = tmp->_next;
		}
		return NULL;
	}
	//逆序双向链表方法一
	//void Reverse()
	//{
	//	if((_head == NULL)||(_head == _tail))
	//	{
	//		return;
	//	}
	//	Node* begin = _head;
	//	Node* end = _tail;
	//	while((begin!=end)&&(begin->_prev!=end))
	//	{
	//		swap(begin->_data, end->_data);
	//		begin = begin->_next;
	//		end = end->_prev;
	//	}
	//}
	//逆序双向链表方法二
	void Reverse()
	{
		if((_head == NULL)||(_head == _tail))
		{
			return;
		}
		Node* begin = _head;
		Node* start = _head;
		while(begin!=_tail)
		{
			swap(begin->_next, begin->_prev);
			begin = begin->_prev;
		}
		swap(begin->_next, begin->_prev);
		begin->_prev = NULL;
		start->_next = NULL;
		_head = begin;
		_tail = start;
	}
	void Print()
	{
		if(_head == NULL)
		{
			cout<<"List is empty"<<endl;
			return;
		}
		Node* cur = _head;
		while(cur)
		{
			cout<<cur->_data<<"->";
			cur = cur->_next;
		}
		cout<<"over"<<endl;
	}
private: 
	Node* _head; 
	Node* _tail; 
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值