双向链表的逆置(两种)
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; }注意测试用例的选取
相关文章推荐
- java数据结构之实现双向链表的示例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C#双向链表LinkedList排序实现方法
- C语言实现双向链表
- PHP小教程之实现双向链表
- Java实现双向链表(两个版本)
- java中使用双向链表实现贪吃蛇程序源码分享
- 数据结构(2)-双向链表的实现
- 通用双向链表(一)——接口设计
- 通用双向链表(二)———接口实现
- 循环链表与双向链表
- 双向链表
- 双循环链表的逆置
- 数据结构与算法之链表4---双向链表
- 双向链表实现约瑟夫双向生死游戏
- Java数据结构-线性表之双向链表
- SICILY 1934 移动小球
- OJ平台的逆置线性表
- 链表模块
- LinuxC双向链表的各种操作