题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
struct ListNode
{
      int       m_nKey;
      ListNode* m_pNext;
};
分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。
看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。反转链表的算法详见本人面试题精选系列的第19题,在此不再细述。但该方法需要额外的操作,应该还有更好的方法。
接下来的想法是从头到尾遍历链表,每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始输出结点的值,此时输出的结点的顺序已经反转过来了。该方法需要维护一个额外的栈,实现起来比较麻烦。
既然想到了栈来实现这个函数,而递归本质上就是一个栈结构。于是很自然的又想到了用递归来实现。要实现反过来输出链表,我们每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的输出结果就反过来了。
基于这样的思路,不难写出如下代码:
///
// Print a list from end to beginning
// Input: pListHead - the head of list
///
void PrintListReversely(ListNode* pListHead)
{
      if(pListHead != NULL)
      {
            // Print the next node first
            if (pListHead->m_pNext != NULL)
            {
                  PrintListReversely(pListHead->m_pNext);
            }
            // Print this node
            printf("%d", pListHead->m_nKey);
      }
}
扩展:该题还有两个常见的变体:
1.       从尾到头输出一个字符串;
2.       定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。

程序员面试题精选(31):从尾到头遍历链表相关推荐

  1. 程序员面试题精选100题(19)-反转链表[数据结构]

    题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点.链表结点定义如下: struct ListNode {int m_nKey;ListNode* m_pNext; }; 分析:这是一道 ...

  2. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  3. 程序员面试题精选算法58题加答案

    这篇文章总结的非常好,以防以后找不到,在此转载. 程序员面试题精选(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点 ...

  4. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  5. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  6. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

  7. 程序员面试题精选100题:41-50解题报告

    程序员面试题精选100题(41)-把数组排成最小的数[算法]   题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个.例如输入数组{32,  321},则输出这两个能 ...

  8. 程序员面试题精选100题:11-40解题报告

    程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]   题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成 ...

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

    面试题5:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 链表结点定义如下: struct ListNode {int m_nKey;ListNode *m_pNex ...

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

    剑指offer--面试题5:从尾到头打印链表 Solution1:我的答案 /** * struct ListNode { * int val; * struct ListNode *next; * ...

最新文章

  1. opencv阈值分割类型
  2. MPLS基本结构是怎样的?—Vecloud微云
  3. 在sae中使用jfinal框架开发web工程遇到的问题
  4. Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
  5. golang变量使用细节
  6. 加工中心刻字宏程序_【宏程序高级案例】涡轮发动机转动轴叶轮的编程思路与程序解析...
  7. [转]计算机视觉领域稍微容易中的期刊(第一版)
  8. 最优乘车(信息学奥赛一本通-T1377)
  9. 怎么找到python的文件_python – 如何找到文件所在的挂载点?
  10. mysql数据库别名_MySQL数据库表名、列名、别名区分大小写的问题
  11. python画微信公众号首图
  12. Python实现多张图片合成一张马赛克图片
  13. Java发送SMS短信
  14. 获取股票交易数据的Tushare的使用方法
  15. ipython和pycharm的区别_ipython和pycharm有什么区别
  16. Word2010中怎样压缩图片使文件变小
  17. 深耕智慧互联网,华数传媒正重新定义生活方式
  18. 循环冗余校验码例题[转帖]
  19. 国产ETL etl-engine 星光不问赶路人 时我不待
  20. 《ClickHouse原理解析与应用实践》读书笔记(1)

热门文章

  1. u盘显示文件乱码怎么办?数据还有机会恢复吗
  2. (十九)有效的字母异位
  3. 手机看图app android开源小众,4款小众实用的手机APP,全是安卓手机的黑科技软件!...
  4. Swift3.0可选类型(Optional)倾心总结
  5. 期货开户公司需要金融牌照
  6. KEY_WOW64_64KEY and KEY_WOW64_32KEY
  7. dedecms 搬家流程
  8. Wordpress--博客搬家跳坑步骤
  9. 每天学点儿树莓派(番外一)——AirPlay播放器
  10. 兄弟Brother HL-5595DNH 驱动