单链表逆序
2015-12-19 12:55
232 查看
本笔记用递归方法实现单链表的逆序!
递归方法的常用步骤:
1. 生成子问题。
子问题须与原始问题为同样的事,且更为简单。即把N的问题简化到N-1;
2. 构造出口。
不能无限制地调用本身,须有个出口,化简为非递归状况处理。即当N==某个值时可解。
首先,我们实现从N到N-1:
对于链表A->B->C->D->NULL,我们对后面的B->C->D->NULL 进行逆序: D->C->B->NULL
然后我们在B后插入A:D->C->B->A->NULL
代码:
接着,我们实现出口:
当链表只有两个节点时,直接交换两个节点即实现链表的逆序。
代码:
完整的实现过程:
递归方法的常用步骤:
1. 生成子问题。
子问题须与原始问题为同样的事,且更为简单。即把N的问题简化到N-1;
2. 构造出口。
不能无限制地调用本身,须有个出口,化简为非递归状况处理。即当N==某个值时可解。
首先,我们实现从N到N-1:
对于链表A->B->C->D->NULL,我们对后面的B->C->D->NULL 进行逆序: D->C->B->NULL
然后我们在B后插入A:D->C->B->A->NULL
代码:
Node* reversalList(Node* pHead) { //对后面的节点进行逆序 Node* nowHead = reversalList(pHead->mpNext); //在新链表的最后插入原头结点 Node* pNode = nowHead; while (pNode->mpNext) { pNode = pNode->mpNext; } pHead->mpNext = pNode->mpNext; pNode->mpNext = pHead; return nowHead; }
接着,我们实现出口:
当链表只有两个节点时,直接交换两个节点即实现链表的逆序。
代码:
Node* reversalTwo(Node* pHead) { Node* pNode = pHead; pHead = pHead->mpNext; pNode->mpNext = pHead->mpNext; pHead->mpNext = pNode; return pHead; } //如果只有两个节点则直接交换 if(pHead->mpNext->mpNext == NULL) { return reversalTwo(pHead); }
完整的实现过程:
#include <iostream> struct Node { int mVal; Node* mpNext; }; void addNode(Node* pHead, int val) { if(NULL == pHead) return; Node* pNode = new Node; pNode->mVal = val; pNode->mpNext = pHead->mpNext; pHead->mpNext = pNode; } Node* createList() { Node* pHead = new Node; pHead->mVal = 0; pHead->mpNext = NULL; return pHead; } Node* reversalTwo(Node* pHead) { Node* pNode = pHead; pHead = pHead->mpNext; pNode->mpNext = pHead->mpNext; pHead->mpNext = pNode; return pHead; } Node* reversalList(Node* pHead) { if(pHead->mpNext->mpNext == NULL) { return reversalTwo(pHead); } Node* nowHead = reversalList(pHead->mpNext); Node* pNode = nowHead; while (pNode->mpNext) { pNode = pNode->mpNext; } pHead->mpNext = pNode->mpNext; pNode->mpNext = pHead; return nowHead; } void main() { Node* pHead = createList(); addNode(pHead, 1); addNode(pHead, 2); addNode(pHead, 3); Node* nowHead = reversalList(pHead->mpNext);//因为createList返回的头结点并没有保存有用数值,所以首节点用头结点的next; return; }
相关文章推荐
- VC6.0 常用快捷键
- 查询 + 添加 + 修改 一条sql 搞定~
- ajax回调函数不能赋值
- Win10系统怎么验证系统文件?win10文件签名验证的方法
- 取消GridView/ListView item被点击时的效果
- python:序列:字符串,列表,元组
- 由12306.cn谈谈网站性能技术
- 获取网络图片之---内存溢出解决方案
- QQ音乐无损歌曲接口api
- html中图片自适应浏览器和屏幕,宽度高度自适应
- 【转】Linux 概念架构的理解
- RAID
- 第14周项目6 是否二叉排序树?
- 【Mark】谁能从事最具幸福感的职业
- Linux 0.12内核与现代内核在内存管理上的区别
- 二叉树求叶子数
- datatables.js 简单使用--弹出编辑框或添加数据框
- 百度统计升级网页实时推送至搜索引擎功能
- 安卓如果在oncreate里面调用setText会造成黑屏
- EL表达式怎么获取Map的动态key?