zoukankan      html  css  js  c++  java
  • 【100题】第五十八题 从尾到头输出链表

    一,题目

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

          int       m_nKey;
          ListNode* m_pNext;
    };

    二,分析

     

           解法一:把链表中链接结点的指针反转过来,改变链表的方向。然后就可以从头到尾输出了。参考 

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

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

     

    三,代码

    基于这样的思路,不难写出如下代码:

     

    void PrintListReversely(ListNode* pListHead)
    {
          if(pListHead != NULL)
          {
                if (pListHead->m_pNext != NULL)
                      PrintListReversely(pListHead->m_pNext);
                else 
                      printf("%d", pListHead->m_nKey);
          }
    }


     

    扩展:该题还有两个常见的变体:
           1.      
    从尾到头输出一个字符串;
           2.      
    定义一个函数求字符串的长度,要求该函数体内不能声明任何变量。

    #include <iostream>
    using namespace std; 
    
    void print(char *str)
    {
    		if(*(str+1)!='\0')
    	    	 print(str+1);
        
             printf("%c ",str[0]); 	
    }
     
    
    int  getlength(char *str)
    {
    	if(*str=='\0')
    		return 0;
    	else
    	    return getlength(str+1)+1; 
    	
    } 
    int main()
    {
    	char *str="abcde"; 
    	cout<<getlength(str)<<endl;
    	
    	print(str); 
    } 

     

     

     

     

  • 相关阅读:
    Allegro PCB Design GXL (legacy) 使用slide无法将走线推挤到焊盘的原因
    OrCAD Capture CIS 16.6 导出BOM
    Altium Designer (17.0) 打印输出指定的层
    Allegro PCB Design GXL (legacy) 将指定的层导出为DXF
    Allegro PCB Design GXL (legacy) 设置十字大光标
    Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
    magento产品导入时需要注意的事项
    magento url rewrite
    验证台湾同胞身份证信息
    IE8对css文件的限制
  • 原文地址:https://www.cnblogs.com/secbook/p/2654951.html
Copyright © 2011-2022 走看看