#include
#include
using namespace std;
template
struct LinkNode
{
LinkNode(const T& x)
:_data(x)
, _prev(NULL)
, _next(NULL)
{
}
T _data;
LinkNode* _prev;
LinkNode* _next;
};
template
class List
{
public:
List()
:_head(NULL)
, _tail(NULL)
{
}
void PushBack(const T& x)
{
if (_head == NULL)
{
_head = new LinkNode(x);
_tail = _head;
}
else
{
LinkNode* tmp = new LinkNode(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 *del = _tail;
_tail->_prev->_next = NULL;
_tail = _tail->_prev;
delete del;
}
}
void PushFront(const T& x)
{
if (_head == NULL)
{
_head = new LinkNode(x);
_tail = _head;
}
else
{
LinkNode* tmp = new LinkNode(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 *del = _head;
_head->_next->_prev = NULL;
_head = _head->_next;
delete del;
}
}
~List()
{
while (_head)
{
Destory();
}
_head = _tail = NULL;
}
void Print()
{
LinkNode* cur = _head;
while (cur)
{
cout <_data) <";
cur = cur->_next;
}
cout <
}
void Reverse_()
{
if (_head == NULL || _head == _tail)
return;
LinkNode* left = _head;
LinkNode* 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* 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* del = _head;
_head = _head->_next;
_head->_prev = NULL;
delete del;
}
}
protected:
LinkNode* _head;
LinkNode* _tail;
};
void Test1()
{
List 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;
}
注意测试用例的选取