【总结】逆置双向链表的三种方法
2016-03-05 12:37
357 查看
双向链表的遍历要比单向链表方便很多,所以逆置方法要比单链表丰富很多,因为可以从后向前遍历,所以可以像逆置数组一样进行操作,也可以根据单链表的特性进行逆置,也可以用双链表独有的特性进行逆置。具体方法如下:
链表的类定义如下:
1.通过头尾指针向中间遍历,交换所存储的内容。
创建新的双向链表指针,将目标链表从前向后遍历/从后向前遍历,把每个节点的元素进行头插/尾插。
链表的类定义如下:
typedef int DataType; class DSNode { public: friend class DNSList; DSNode(DataType x=0) :_data(x), _next(NULL), _prev(NULL) { } private: DSNode*_prev; DSNode*_next; DataType _data; }; class DNSList { public: DNSList() :_head(NULL), _tail(NULL) { } ~DNSList() { _Clear(); } DNSList(const DNSList &l) { DSNode *cur = l._head; while (cur) { PushBack(cur->_data); } } DNSList operator = (DNSList l) { _Clear(); DSNode *cur = l._head; while (cur) { PushBack(cur->_data); } } public: // 头插/头删/尾插/尾删 void PushBack(const DataType& x); void PopBack(); void PushFront(const DataType& x); void PopFront(); // 插入/查找/删除 void Insert(DSNode* pos, const DataType& x); DSNode* Find(const DataType& x); void Erase(const DataType& x); //void Reverse();//同一空间复杂度不需要返回值 DNSList* Reverse();//不同空间复杂度通过链表指针返回 // 打印 void Print(); private: void _Clear() { while (_head) { DSNode*cur = _head; _head = _head->_next; delete cur; } } DSNode *_head; DSNode *_tail; };在单一空间复杂度下:
1.通过头尾指针向中间遍历,交换所存储的内容。
void DNSList::Reverse() { DSNode *begin = _head; DSNode *end = _tail; while (!(begin==end||begin->_prev==end)) { DataType tmp = begin->_data; begin->_data = end->_data; end->_data = tmp; end = end->_prev; begin = begin->_next; } }2.单纯通过头指针向后遍历,交换每个节点的前驱与后继。
void DNSList::Reverse() { std::swap(_head, _tail); DSNode*cur = _head; while (cur) { std::swap(cur->_next, cur->_prev); cur = cur->_next; } }在多重空间复杂度下:
创建新的双向链表指针,将目标链表从前向后遍历/从后向前遍历,把每个节点的元素进行头插/尾插。
DNSList* DNSList::Reverse() { DNSList*NewList = new DNSList; DSNode *cur = _head; while (cur) { NewList->PushFront(cur->_data); cur = cur->_next; } return NewList; }如有不足或错误,希望批评指正。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性