acwing17给了一个头节点,从尾到头输出链表的元素,顺便练练容器

本文介绍了两种方法来实现单链表的逆序输出。第一种是使用动态数组(vector)存储链表元素,然后逆置数组;第二种是通过递归方式,从链表尾部开始返回值。同时提到了递归过程中内存栈的工作原理以及使用栈来辅助逆序遍历链表的方法。
摘要由CSDN通过智能技术生成

在这里插入图片描述方法一
建立一个数组,从头到尾遍历一遍链表,然后将链表的每个元素的值赋给数组
犯了一个错误
新建的vector容器是一个可变长的数组,要想像数组下标那样访问前提是这个下标所指向的元素得存在,这也就跟那个声明一维数组得写出长度来一回事。
我就犯了访问越界 的问题,所以如果这个元素不存在,那就得用push_back()方法来添加一个新元素到容器末尾

所以要注意vector 可变长数组的问题。

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
        vector<int> num;
        int i=0;
        ListNode * p=head;
        while(p!=NULL){
            num.push_back(p->val);
            p=p->next;
        }
         reverse(num.begin(),num.end());//逆置数组.容器自带的
         
      return num;
      
        
    }
};

也可以用反向迭代器
rbegin()是一个函数,用于返回一个逆序迭代器,指向容器的最后一个元素
可以用它来进行反向遍历。例如,rbegin()和rend()可以用于对容器中的元素进行反向遍历,例如:

vector<int> v = {1, 2, 3, 4, 5};
for(auto it = v.rbegin(); it != v.rend(); ++it) {
    cout << *it << " "; // 输出 5 4 3 2 1
}

在此示例中,rbegin()返回一个逆序迭代器,它指向5这个元素,然后通过递增迭代器,依次访问4、3、2、1等元素。

或者用这句来直接返回逆置数组

 return vector<int>(res.rbegin(), res.rend());

方法二 递归:

这段代码是用递归实现单链表的倒序输出,每次递归调用将 head->next 传入递归函数,直到链表末尾,返回一个空的 vector。然后每次回溯时将当前节点的值 head->val 加入到 vector 中。

整个过程就是一个递归调用的过程,因此每次函数调用都会在内存栈中分配一段空间。调用栈的排列顺序遵循先进后出的原则,即最后调用的函数最先返回,因此先访问链表末尾的节点。

class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
       if(!head)return ;
       auto res=printListReversingly(head->next);
       res.push_back(head->val);
       return res;
       
    }
};

到这递归又犯晕了一会儿,举一个例子,注意看箭头的指示

在这里插入图片描述

也可以自己声明个栈

class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
       stack<int>s;
       vector<int>res;
       while(head){
           s.push(head->val);
           head=head->next;
       }
       //也可以直接声明栈大小的数组
       //vector<int>(s.size());
       while(!s.empty()){//正好练了容器栈的应用
       res.push_back(s.top());
       s.pop();
           
       }
       return res;
       
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值