单向链表的递归反转
2016-04-01 12:09
239 查看
单向链表反转的递归实现
#include <iostream> // 链表的节点类型 struct LinkNode { int Val; LinkNode * Next; LinkNode() { Next = NULL; } LinkNode(int v) { Val = v; Next = NULL; } }; // 链表类型 struct List { LinkNode * Head; LinkNode * Tail; List() { Head = new LinkNode; // dummy node Tail = Head; Tail->Next = NULL; Tail->Val = -1; } ~List() { LinkNode * temp; while (!empty()) { temp = deleteFirstNode(); delete temp; } } LinkNode * deleteFirstNode() { LinkNode * temp = Head; Head = Head->Next; return temp; } void addTailNode(LinkNode * n) { if (empty()) { Head = n; n->Next = Tail; } else { // 遍历链表,定位到最后一个节点(非哑节点) // 若双向链表,不需遍历 LinkNode * t = Head; for (; t->Next != Tail; t = t->Next) ; t->Next = n; n->Next = Tail; } } void print() { for (LinkNode * t = Head; t != Tail; t = t->Next) { std::cout << t->Val << " "; } std::cout << std::endl; } bool empty() { return Head == Tail; } }; // 使用递归的方式反转单向链表 // --------------------- // 先删掉链表的第一个节点, 然后反转链表 // 最后把删除的第一个节点 链接 到反转后的链表后面 void reverseList(List & l) { if (l.empty()) return ; LinkNode * first = l.deleteFirstNode(); reverseList(l); l.addTailNode(first); } int main() { List l; // 添加100个元素测试 for (int i = 1; i <= 100; ++i) { l.addTailNode(new LinkNode(i)); } l.print(); reverseList(l); l.print(); return 0; }
还可以直接使用堆栈实现,效率更高。其实递归也是隐式使用堆栈。
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#中的尾递归与Continuation详解
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- C++实现简单的学生管理系统
- php递归创建目录的方法
- PHP递归创建多级目录
- Javascript递归打印Document层次关系实例分析
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例
- oracle 使用递归的性能提示测试对比
- 使用curl递归下载软件脚本分享
- Perl脚本实现递归遍历目录下的文件