从尾到头打印链表

从尾到头打印链表

https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=23278&ru=%2Fpractice%2Ff836b2c43afc4b35ad6adc41ec941dba&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=

从尾到头打印链表

方法一:递归

思路:

我们都知道链表无法逆序访问,那肯定无法直接遍历链表得到从尾到头的逆序结果。但是我们都知道递归是到达底层后才会往上回溯,因此我们可以考虑递归遍历链表,因此三段式如下:

终止条件: 递归进入链表尾,即节点为空节点时结束递归。

返回值: 每次返回子问题之后的全部输出。

本级任务: 每级子任务递归地进入下一级,等下一级的子问题输出数组返回时,将自己的节点值添加在数组末尾。

具体做法:

step 1:从表头开始往后递归进入每一个节点。

step 2:遇到尾节点后开始返回,每次返回依次添加一个值进入输出数组。

step 3:直到递归返回表头。

代码:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    void recurision(ListNode* head,vector<int>& res){
        //递归的终止条件:如果向下递归到达了链表的null,则就可以向上返回
        if(head==NULL){
            return;
        }
        //本级任务:
        //1.不断向下递归:将大问题分解成小问题
        //2.每次把当前的节点的值添加到返回的数组的后面
        recurision(head->next,res);
        res.push_back(head->val);
    }
    //读入链表的头结点,返回的是从尾到头的数组
    vector<int> printListFromTailToHead(ListNode* head) {
        //开创一个新的res容器用来存从尾到头的打印的数组
        vector<int> res;
        //递归函数
        recurision(head,res);
        return res;
    }
};

方法二:栈(先进后出)

思路:

1.先将链表中的所有节点的值都存入到栈中

2.再将栈中的所有的值返回,每返回一个值就将那个值存入到vector中

3.返回vector

代码:

class Solution{
    public:
     vector<int> printListFromTailToHead(ListNode* head){
        //用栈写:因为栈是先进后出的额结构:与递归的思想是类似的
         stack<int> node;
         //创建一个容器:用于存逆序的链表的节点的值
        vector<int> now;
        //遍历整个链表,将每个节点的值用push函数放入栈中
        while(head!=NULL){
             node.push(head->val);
             head=head->next;
        }
        //只要栈不为空,就用top()获得栈的头结点,放入vector中
        //再让现在的栈顶元素出栈
        while(!node.empty()){
            now.push_back(node.top());
            node.pop();
        }
         return now;
     }
};
全部评论

相关推荐

牛客533433175号:更可气的是我做完这些给我拒了
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务