• 从尾到头打印单链表


      要实现从尾到头打印链表,方法很多,但常用的有两种方法,一是递归,二是利用栈。

      首先定义一个链表: 

    struct ListNode{
      int m_nKey;          //
      ListNode* m_pNext;      //指向下一个值的指针
    }

      第一种利用递归的方法:

      

    void PrintListReversingly_Recursively(ListNode* pHead){
      if(pHead!=NULL)  {   //先判断链表是否为空
        if(p_Head->m_pNext !=NULL) {  //然后判断链表中只有一个元素
          PrintListReversingly_Recursively(pHead->m_pNext);  //递归到下一个元素
        }
         printf("%d	",pHead->m_nValue);  //如果只有一个元素的时候,就打印这个元素,此时已经递归到最后一个元素,即从最后一个元素开始打印,然后层层返回,依次打印到第一个元素
      }
    }

      第二种方法是调用栈,因为栈是先进后出的,所以我们需要先创建一个栈,用来存储链表中的元素,当链表中所有的元素都被栈存储后,就将这些元素依次打印 

    #include <stack>
    using namespace std;
    
    void PrintListReversingly_stack(ListNode* pHead){
      stack<ListNode*> nodes;    //创建一个能够容纳ListNode*类型元素的栈
      ListNode* pNode=pHead;   //创建ListNode*类型的头指针,用来指向链表的第一个元素
      while(pNode != NULL){   //当pNode还没有遍历完链表时
        nodes.push(pNode);   //就将当前所指的元素放在栈里面
        pNode=pNode->m_pNext;    //然后继续指向链表中的下一个元素,直到将所有的元素都放在栈中
      }
       while(!nodes.empty()){   //此时开始遍历栈里面的元素
         pNode=nodes.top();    //首先将pNode指针指向栈顶元素
         printf("%d	",pNode->m_nValue);  //依次打印出栈里面的元素
         nodes.pop();   将已打印的元素弹出栈,然后指向下一个元素
       }
    }    

      这两种方法相比而言,递归的方法比较简单,但是递归的本质就是一个栈结构。如果链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显示用栈基于循环实现的代码鲁棒性要好一些。

  • 相关阅读:
    学习完vue指令 做的一个学生信息录入系统
    vue常用指令总结
    vue介绍以及相关概念理解大全
    class类
    javascript闭包详解
    前端必看网站(一直更新中)
    微信小程序wx.getUserInfo获取用户信息
    微信小程序自定义组件注意事项
    微信小程序自定义选项卡
    uni-app开发注意事项及常用样式
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3474659.html
Copyright © 2020-2023  润新知