双向链表的逆置(两种)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双向链表的逆置(两种)相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<string>
using namespace std;
template<class T>
struct LinkNode
{
	LinkNode(const T& x)
		:_data(x)
		, _prev(NULL)
		, _next(NULL)
	{

	}
	T _data;
	LinkNode<T>* _prev;
	LinkNode<T>* _next;
};
template<class T>
class List
{
public:
	List()
		:_head(NULL)
		, _tail(NULL)
	{
	}
	void PushBack(const T& x)
	{
		if (_head == NULL)
		{
			_head = new LinkNode<T>(x);
			_tail = _head;
		}
		else
		{
			LinkNode<T>* tmp = new LinkNode<T>(x);
			_tail->_next = tmp;
			tmp->_prev = _tail;
			_tail = _tail->_next;
		}

	}
	void PopBack()
	{
		if (_head == NULL)
		{
			return;
		}
		else if (_head == _tail)
		{
			delete _head;
			_head = _tail = NULL;
		}
		else
		{
			LinkNode<T> *del = _tail;
			_tail->_prev->_next = NULL;
			_tail = _tail->_prev;
			delete del;
		}
	}
	void PushFront(const T& x)
	{
		if (_head == NULL)
		{
			_head = new LinkNode<T>(x);
			_tail = _head;
		}
		else
		{
			LinkNode<T>* tmp = new LinkNode<T>(x);
			tmp->_next = _head;
			_head->_prev = tmp;
			_head = tmp;
		}
	}
	void PopFront()
	{
		if (_head == NULL)
		{
			return;
		}
		else if (_head == _tail)
		{
			delete _head;
			_head = _tail = NULL;
		}
		else
		{
			LinkNode<T> *del = _head;
			_head->_next->_prev = NULL;
			_head = _head->_next;
			delete del;
		}
	}
	~List()
	{
		while (_head)
		{
			Destory();
		}
		_head = _tail = NULL;
	}
	void Print()
	{
		LinkNode<T>* cur = _head;
		while (cur)
		{
			cout << (cur->_data) << "->";
			cur = cur->_next;
		}
		cout << "NULL" << endl;
	}
	void  Reverse_()
	{
		if (_head == NULL || _head == _tail)
			return;
		LinkNode<T>* left = _head;
		LinkNode<T>* right = _tail;
		while (left != right&&left->_prev != right)//保证奇偶节点都没问题
		{
			swap(left->_data, right->_data);
			left = left->_next;
			right = right->_prev;
		}

	}
	void  Reverse()
	{
		if (_head == NULL || _head == _tail)
			return;
		LinkNode<T>* cur = _head;
		while (cur)
		{
			swap(cur->_prev, cur->_next);
			cur = cur->_prev;//注意
		}
		swap(_head, _tail);
	}
protected:
	void Destory()
	{
		if (_head == NULL)
		{
			return;
		}
		else if (_head == _tail)
		{
			delete _head;
			_head = _tail = NULL;
		}
		else
		{
			LinkNode<T>* del = _head;
			_head = _head->_next;
			_head->_prev = NULL;
			delete del;
		}
	}
protected:
	LinkNode<T>* _head;
	LinkNode<T>* _tail;
};


void  Test1()
{
	List<int> k;
	k.PushBack(1);
	k.PushBack(2);
	k.PushBack(3);
	k.PushBack(4);
	k.PushBack(5);
	k.PushBack(6);

	k.Print();

	k.Reverse_();
	k.Print();

	k.Reverse();
	k.Print();
}
int main()
{
	Test1();
	system("pause");
	return 0;
}

注意测试用例的选取

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1748810

以上是关于双向链表的逆置(两种)的主要内容,如果未能解决你的问题,请参考以下文章

c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)

C++实现双向链表的所有操作,包括逆置双链表(三种方法)

两种单链表的逆置详解

链表练习题

数据结构实验之链表三:链表的逆置

链表的逆置