从尾到头打印一个链表
2016-05-02 11:58
513 查看
这样的链表问题时不时的出现,你有没有特定的方法去处理呢:以下给出你可能用到的算法:
第一种:改变链表的结构
思想:
1.从尾到头打印链表,那就逆置链表呗
2.打印逆置后的链表;
这个简单,直接上代码:
方法二:借用栈
思想:
1.由于是从尾部开始打印,如果我们是从头开始遍历,那么先遍历的后打印,这正好的栈的特点。
2.遍历完了之后,所有节点入栈,之后出栈打印。
于是,下边简单的代码又出来了:
思想:
1.递归就是用栈的思想,既然能想到栈,递归也就想到了
代码:
赐教.
第一种:改变链表的结构
思想:
1.从尾到头打印链表,那就逆置链表呗
2.打印逆置后的链表;
这个简单,直接上代码:
void PrintListRevers(ListNode* pHead) { //1.链表逆置 ListNode* newHead = NULL; ListNode* cur = pHead; while (cur) { ListNode* tmp = cur; cur = cur->m_pNext; tmp->m_pNext = newHead; newHead = tmp; } //2.打印逆置链表 ListNode* tmp = newHead; while (tmp) { cout << tmp->m_nValue << " "; } cout << endl; }很简单,但是,很不辛的改变了链表原来的结构 这是一种只做读操作不应该出现的,所以,有下边的算法;
方法二:借用栈
思想:
1.由于是从尾部开始打印,如果我们是从头开始遍历,那么先遍历的后打印,这正好的栈的特点。
2.遍历完了之后,所有节点入栈,之后出栈打印。
于是,下边简单的代码又出来了:
void PrintListRevers(ListNode* pHead) { std::stack<ListNode*> nodes; ListNode* pNode = pHead; while(pNode != NULL) { nodes.push(pNode); pNode = pNode->m_pNext; } while(!nodes.empty()) { pNode = nodes.top(); printf("%d\t", pNode->m_nValue); nodes.pop(); } }方法三:递归
思想:
1.递归就是用栈的思想,既然能想到栈,递归也就想到了
代码:
void PrintListRevers(ListNode* pHead) { if(pHead != NULL) { if (pHead->m_pNext != NULL) { PrintListRevers(pHead->m_pNext); } //printf很好控制打印格式 printf("%d\t", pHead->m_nValue); } }但是,递归的缺点很明显,如果连边过长,就会造成栈溢出等问题,谨慎使用!
赐教.
相关文章推荐
- 一个毕业设计 妇幼健康助手软件
- python 内置函数zip()
- 通过经纬度获取地址值(使用百度地图API)
- mac使用记录
- 啊哈!算法—坑爹的奥数
- ansible使用过程中遇到的问题
- HDU-ACM2090
- new和malloc的区别
- 算法导论:Trie字典树
- LITTLE SHOP OF FLOWERS
- 第56课:解密Spark SQL与DataFrame的本质
- HTML5WebStorage本地储存之Session
- MyEclipse配置SVN
- HDU-ACM2089
- 【Java学习-J.160430.0.15】笔记8-使用JDBC连接数据库
- vb控件相关ocx文件注册问题
- 设计模式(十六)迭代器模式
- HDU-ACM2088
- ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
- Linux下安装配置Mongdb数据库