zoukankan      html  css  js  c++  java
  • [链表]从尾到头输出链表

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

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

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

  • 相关阅读:
    771. Jewels and Stones
    706. Design HashMap
    811. Subdomain Visit Count
    733. Flood Fill
    117. Populating Next Right Pointers in Each Node II
    250. Count Univalue Subtrees
    94. Binary Tree Inorder Traversal
    116. Populating Next Right Pointers in Each Node
    285. Inorder Successor in BST
    292. Nim Game Java Solutin
  • 原文地址:https://www.cnblogs.com/dartagnan/p/2200747.html
Copyright © 2011-2022 走看看