`
caoruntao
  • 浏览: 467974 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

从尾到头输出链表

 
阅读更多

【转】http://zhedahht.blog.163.com/blog/static/2541117420079237185699/

 

题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:

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.       定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。

分享到:
评论

相关推荐

    面试题6--从尾到头打印链表.c

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值。 输入: 每个输入件仅包含一组测试样例。 每一组测试案例包含多行,每行一个大于...对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。

    从尾到头打印链表1

    从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输出:[2,3,1]"* Definition for singl

    Trouvaille0198#Notes#剑指 Offer 06. 从尾到头打印链表1

    剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输出:[2,3,1]辅助栈// 辅助栈s

    基于python实现从尾到头打印链表

    输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 思路 遍历链表,把结构保存在list里面,然后把list逆序输出 代码 # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self.val = x #...

    NoCodeNolife-cloud#leetcode-Practice-Questions#剑指 Offer 06. 从尾到头

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输出:[2,3,1]限制:0 链表长度 * Definiti

    Leetcode刷题:剑指offer【面试题06】

    【面试题06】从尾到头打印链表 难度: 简单 限制: 0 <= 链表长度 <= 10000 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 Leetcode题目对应位置: 面试题06:从尾到头打印链表 思路...

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    5.从尾到头打印链表.6.由前序和中序遍历重建二叉树.7.用两个栈实现队列8.求旋转数组的最小数字、9.斐波那契数列的第n项(青蛙跳台阶)10.二进制中1的个数、11.数值的整数次方、12.打印1到最大的n位数13. O(1)时间删除...

    算法面试题

    输入一个链表的头结点,从尾到头反过来打 印出每个结点的值。 输入某二叉树的前序遍历和中心遍历的结 果,请重建该二叉树。:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库 ...

    《剑指Offer》题目及代码.zip

    5. 从尾到头打印链表 6. 由前序和中序遍历重建二叉树 7. 用两个栈实现队列 8. 求旋转数组的最小数字 9. 斐波那契数列的第n项(青蛙跳台阶) 10. 二进制中1的个数 11. 数值的整数次方 12. 打印1到最大的n位数 ...

    LeetCode判断字符串是否循环-algorithm:算法

    从尾到头打印链表 4. 重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2...

    数据结构与算法.xmind

    递归从尾到头输出单链表 只要下面还有数据,那就往下找,递归是从最后往前翻。 反转链表 有递归和非递归两种方式 双向链表 循环链表 树 二叉树 完全二叉树 堆 满二叉树 ...

    世界500强面试题.pdf

    1.6.5. 输入一个链表的头结点,从尾到头反到来输出每个结点的值..............134 1.6.6. 用 C++设计一个不能被继承的类 .......................................................136 1.6.7. 给定链表的头指针和一...

Global site tag (gtag.js) - Google Analytics