面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

链表结点定义如下:

struct ListNode
{int m_nKey;ListNode *m_pNext;
};

通常打印是一个只读操作,我们不希望打印时修改内容。

假设面试官也要求这个题目不能改变链表的结构。

接下来我们想到解决这个问题肯定要遍历链表。

遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。

也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。

这就是典型的“后进先出”,我们可以用栈实现这种顺序。

每经过一个结点的时候,把该结点放到一个栈中。

当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。

这种思路的实现代码如下:

void PrintListReversingly_Iteratively(ListNode *pHead)
{stack<ListNode *>nodes;ListNode *pNode = pHead;while (pNode != nullptr){nodes.push(pNode);pNode = pNode->m_pNext;}while (!nodes.empty()){pNode = nodes.top();cout << pNode->m_nKey << " ";nodes.pop();}cout << endl;
}

既然想到了用栈来实现这个函数,而递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
基于这样的思路,不难写出如下代码:

void PrintListReversingly_Iteratively(ListNode *pHead)
{if (pHead != nullptr){if (pHead->m_pNext != nullptr){PrintListReversingly_Iteratively(pHead->m_pNext);}cout << pHead->m_nKey << " ";}
}

上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。

测试用例:
● 功能测试(输入的链表有多个结点,输入的链表只有一个结点)。
● 特殊输入测试(输入的链表头结点指针为NULL)。
本题考点:
● 考查对单项链表的理解和编程能力。
● 考查对循环、递归和栈3个相互关联的概念的理解。

[剑指offer]面试题5:从尾到头打印链表相关推荐

  1. 剑指offer面试题[5]-从尾到头打印链表

    目描述 输入一个链表,从尾到头打印链表每个节点的值. /** *  struct ListNode { *        int val; *        struct ListNode *next ...

  2. 剑指Offer - 面试题6. 从尾到头打印链表(栈,递归,反转链表)

    文章目录 1. 题目 2. 解题 2.1 stack解题 2.2 递归 2.3 反转链表 1. 题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head ...

  3. 剑指offer 面试题5—从尾到头打印链表

    题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 考虑用栈 public void invertedList1(ListNode head) {if (head == null) {r ...

  4. 剑指offer面试题06. 从尾到头打印链表(辅助栈法)

    题目描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 思路 详见链接 代码 class Solution:def reversePrint(self,head:ListNod ...

  5. 剑指Offer - 九度1511 - 从尾到头打印链表

    剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案 ...

  6. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  7. 【剑指offer】登峰造极之从尾到头打印链表

    题目链接 从尾到头打印链表. 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 热度指数:1254529 题目描述 /** struct ListNode { i ...

  8. 剑指offer(C++)-JZ6:从尾到头打印链表(数据结构-链表)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回). 如输入{ ...

  9. 【剑指offer-Java版】05从尾到头打印链表

    从头到尾打印链表:递归实现比较简单 注意处理异常输入:如输入指针为空 处理边界条件等即可 public class _Q05 {public static void main(String[] arg ...

  10. 剑指offer——面试题60:把二叉树打印成多行

    剑指offer--面试题60:把二叉树打印成多行 Solution1: 20180911重做.经典题目.牢记做法! /* struct TreeNode {int val;struct TreeNod ...

最新文章

  1. 【错误记录】集成 Tinker 热修复报错 ( No such property: variantConfiguration for class: .ApplicationVariantData )
  2. 淘宝大数据之路【转】
  3. 还原JavaScript的真实历史~
  4. C# 获取并判断操作系统版本,解决Win10、 Windows Server 2012 R2 读取失败的方案
  5. python flask项目过程_Python 开发过程遇到的问题
  6. session实现购物车
  7. listview bcb 行的颜色_文明交通安全行手抄报简单又漂亮
  8. 人工智能——数据、信息与知识
  9. Linux系统管理第六周作业【Linux微职位】
  10. Tomcat加载类机制 - 我们到底能走多远系列(14)
  11. 游戏开发之C++多继承及虚继承(C++基础)
  12. 计算机语言em,Python:EM(期望极大算法)实战
  13. Java--中文转换拼音,jpinyin-1.0.jar
  14. Google Analytics API V4(谷歌统计实战)
  15. 基于MAC地址划分VLAN
  16. treefrog之视图 ERB
  17. Spring Boot+Vue/前后端分离/高并发/秒杀实战课程之spring Security快速搭建oauth2 内存版身份认证
  18. 脱 PECompact 2.x - Jeremy Collake 壳
  19. win10浏览器服务器代理设置
  20. 怎么实现黑白负片爆闪效果,有Vegas就足够啦

热门文章

  1. 那一年,我考入了西北师范大学GIS专业,然而我很迷茫,GISer的职业规划到底是怎样的?
  2. IOS之学习笔记十四(协议的定义和实现)
  3. Android之java.lang.UnsatisfiedLinkError(Failed to register native method ***callMethod1())解决办法
  4. Android插件化开发之DexClassLoader动态加载dex、jar小Demo
  5. 5.7.21mysql数据库_【数据库】mysql5.7.21 winx64安装配置图文分享
  6. 裸奔、抽烟、凡尔赛,原来数学家玩得这么野……
  7. 小眼睛有多惨?美颜都懒得救你......
  8. 程序猿专属成语 get√
  9. java stream 求和_谈谈Java任务的并行处理
  10. lua loadstring传递参数_lua学习之函数篇