【Leetcode】剑指 Offer 06. 从尾到头打印链表_easy

📣🥳🥳🥳📣

✨Hello! 如果这篇【文章】对你有帮助😄,希望可以给博主点个赞👍鼓励一下😘

📣🥳🥳🥳📣



🔎 题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:0 <= 链表长度 <= 10000

📝 解题方法

【标签:链表、栈、递归、双指针】

📌 顺序读取后翻转

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        //良好习惯:自己声明一个头节点,不要直接操作head,否则函数执行完后头指针到尾部
        ListNode *headptr= head;  
        if (headptr == nullptr) return {}:
        //1.从头到尾读取
        vector<int> ivec;
        while (headptr != nullptr) {
            ivec.push_back(headptr->val);
            headptr = headptr->next;
        }
        //2.翻转后返回
        reverse(ivec.begin(), ivec.end());  //reverse函数包含在algorithm头文件中
        return ivec;
    }
};

在这里插入图片描述
reverse函数的描述👇

/**
   *  @brief Reverse a sequence.
   *  @ingroup mutating_algorithms
   *  @param  __first  A bidirectional iterator.
   *  @param  __last   A bidirectional iterator.
   *  @return   reverse() returns no value.
   *
   *  Reverses the order of the elements in the range @p [__first,__last),
   *  so that the first element becomes the last etc.
   *  For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse()
   *  swaps @p *(__first+i) and @p *(__last-(i+1))
  */

For every @c i such that @p 0<=i<=(__last-__first)/2), @p reverse() swaps @p *(__first+i) and @p *(__last-(i+1))

可见时间复杂度取决于while循环体,即O(N);
空间复杂度O(N)。

📌 链表翻转后顺序读取

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        //良好习惯:自己声明一个头节点,不要直接操作head,否则函数执行完后头指针到尾部。查看头指针是否为nullptr
        ListNode *headptr = head;  
        if (headptr == nullptr) return {};
        //1.翻转链表(需要双指针)
        ListNode *new_headptr = nullptr, *temp = nullptr;  //前者为链表完全翻转后的新头指针,后者用来协助完成链表的翻转
        while (headptr != nullptr) {  //翻转链表的过程见下面的图解
            temp = new_headptr;
            new_headptr = headptr;
            headptr = headptr->next;
            new_headptr->next = temp;
        }
        //2.将翻转后的链表顺序打出
        vector<int> ivec;
        while (new_headptr != nullptr) {
            ivec.push_back(new_headptr->val);
            new_headptr = new_headptr->next;
        }
        re
n ivec;
    }
};

👇链表反转图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时间复杂度O(N);
空间复杂度O(N)。

📌 栈法

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        //良好习惯:自己声明一个头节点,不要直接操作head,否则函数执行完后头指针到尾部。查看头指针是否为nullptr
        ListNode *headptr = head;  
        if (headptr == nullptr) return {};
        //1.定义一个栈,将链表每个节点顺序压入栈中
        stack<int> ista;
        while (headptr != nullptr) {
            ista.push(headptr->val);
            headptr = headptr->next;
        }
        //2.定义一个vector,将栈不断弹出到其中
        vector<int> ivec;
        while (!ista.empty()) {
            ivec.push_back(ista.top());
            ista.pop();pic_center
        }
        return ivec;
    }
};

在这里插入图片描述
时间复杂度O(N);
空间复杂度O(N)。

📌 递归法

class Solution {
public:
    vector<int> ivec;  //vector放在这
    vector<int> reversePrint(ListNode* head) {
        //良好习惯:自己声明一个头节点,不要直接操作head,否则函数执行完后头指针到尾部。查看头指针是否为nullptr
        ListNode *headptr = head;  
        if (headptr == nullptr) return {};
        //递归实现
        reversePrint(headptr->next);
        ivec.push_back(headptr->val);
        return ivec;
    }
};

在这里插入图片描述
时间复杂度O(N);
空间复杂度O(N)。
关于递归的时间复杂度和空间复杂度可见递归算法的时间复杂度和空间复杂度。递归涉及函数的压栈出栈。


✨如有问题欢迎在底下评论留言或私信!

如果这篇【文章】对你有帮助😄,希望可以给博主【点个赞👍】鼓励一下😘

❤️Thanks for your encouragement❤️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

John Chen1223

点赞是美意!打赏是鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值