您的位置:首页 > 其它

双向链表的逆置(两种)

2016-03-08 16:06 302 查看
#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;
}
注意测试用例的选取
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  双向链表 逆置