• 31.从尾到头输出链表[Print linked list from last to first]


    【题目】

    输入一个链表的头结点,从尾到头反过来输出每个结点的值。

    【分析】

    这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。

    • 【链表逆置】

    看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。但该方法需要额外的操作,应该还有更好的方法。

    • 【使用stack存储】

    接下来的想法是从头到尾遍历链表,每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始输出结点的值,此时输出的结点的顺序已经反转过来了。该方法需要维护一个额外的栈,实现起来比较麻烦。

    • 【递归实现】

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

    【代码】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     

    void PrintListReversely(ListNode *pHead)
    {
        
    if (pHead != NULL)
        {
            
    // print next node first
            PrintListReversely(pHead->m_pNext);
            
    // print this node
            printf("%d", pHead->m_pKey);
        }
    }

    【扩展】

    该题还有两个常见的变体。

    1.从尾到头输出一个字符串

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
     

    void PrintStringReversely(char *str)
    {
        
    if (NULL != str && *str != '')
        {
            PrintStringReversely(str + 
    1);
            printf(
    "%c", *str);
        }
    }

    2.定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
     

    int GetStringLength(char *str)
    {
        
    if (NULL != str && *str != '')
            
    return GetStringLength(str + 1) + 1;
        
    return 0;
    }

     【参考】

    http://zhedahht.blog.163.com/blog/static/2541117420079237185699/

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    go 接收发送文件
    【0031】反转整数/判断回文
    【003】链表或字符串的【反转】【左旋转】
    【002】链表或字符串模拟加法/加一/乘法
    【01】数组中只出现一次的数字
    【面试题050】树中两个结点的最低公共祖先
    【面试题049】把字符串转换成整数
    【面试题048】不能继承的类
    【面试题047】不用加减乘除做加法
    【面试题046】求1+2+...+n
  • 原文地址:https://www.cnblogs.com/hellogiser/p/3738879.html
Copyright © 2020-2023  润新知