『牛客网』剑指offer-JZ6 从尾到头打印链表

本文探讨了如何按链表从尾到头的顺序返回节点值,提出使用栈实现的O(n)时间复杂度解决方案,并给出了递归的DFS方法。详细分析了两种方法的时间和空间复杂度,同时提供了C++代码实现。

前言

久违的刷题计划开始了,本次计划为每日一题,路线如下:剑指offer(64题),HOT 100,精选算法 200。

问题

从头到尾打印链表

描述

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

如输入{1,2,3}的链表如下图:
在这里插入图片描述

返回一个数组为[3,2,1]

0 <= 链表长度 <= 10000

示例1

输入:
{1,2,3}
返回值:
[3,2,1]

示例2

输入:
{67,0,24,58}
返回值:
[58,24,0,67]

1. 思路

输入一个链表,返回该链表的反序。按元素先进后出的顺序,考虑借助。设一指针从头到尾遍历链表,边访问边入栈,直到指针遍历完链表后,将栈中各元素逐一出栈并输出

2. 解决方案

c++解决方案:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> output;
        stack<int> s;

    //链表不为空,指针从头到尾遍历链表
        while(head!=NULL){
            s.push(head->val);
            head=head->next;
        }

    //栈不为空,弹栈
        while(!s.empty()){
            output.push_back(s.top());//保存栈顶元素
            s.pop();//栈顶元素出栈
        }
        return output;
    }
};

在这里插入图片描述

复杂度分析:
时间复杂度:O(n)。遍历链表是一个O(n),弹栈需要O(n)
空间复杂度:O(n)。栈空间最大长度是链表的长度n

3. 总结与反思

3.1 解法二 递归写法

由于这个题目需要我们从后面向前面开始打印这个数组。所以我们可以对遍历的结点进行一个递归,我们先递归到这个链表的最后面,然后不断向前收集权值。

思路

用DFS同样会遍历所有的结点,时间复杂度为O(n)
需要存储长度为n的链表的所有的结点,空间复杂度为O(n)

代码
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> ans;
    void dfs(ListNode* now){
        // 递归的出口为当前的指针为空的情况
        if(!now){
            return;
        }
        // 向后面进行递归
        dfs(now->next);
        // 递归之后收集权值
        ans.push_back(now->val);
    }
    vector<int> printListFromTailToHead(ListNode* head) {
        dfs(head);
        return ans;
    }
};

3.2 DFS相关补充知识

考研初试理论:

深度优先搜索(DFS:depth first search)
类似于树的先序遍历; DFS
所经历的边与顶点构成了深度优先生成树,遍历树中高度最高;
复杂度:空间:O(n),时间:邻接矩阵 O(n 2)、邻接表 O(n+e);
应用:判断图是否有环、图的连通性;

优秀博文引用:
DFS模板,解决问题的归纳总结
深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

内容概要:本研究针对微电网在遭受拒绝服务(DoS)攻击时面临的功率分配不均与电能质量问题,提出了一种兼顾功率精确均分与电压频率质量恢复的抗攻击混合动态事件触发二次控制策略。该策略通过设计新型混合动态事件触发机制,有效减少控制器与分布式单元间的网络通信负担,同时增强系统对DoS攻击的鲁棒性。研究构建了完整的微电网二次控制框架,整合了分布式协同控制算法与事件触发通信机制,在保证系统稳定性的同时,实现了对频率、电压偏差的快速调节和有功/无功功率的精确分配。通过Simulink平台进行仿真实验,验证了所提方法在遭受DoS攻击及正常运行工况下均能有效维持微电网的稳定运行与高质量电能输出。; 适合人群:具备电力系统自动化、分布式控制或微电网相关基础知识,从事新能源、智能电网领域研究的研发人员及高年级研究生。; 使用场景及目标:① 解决微电网在通信受限及网络攻击场景下的协同控制难题;② 实现微电网在异常工况下功率均分与电能质量的双重优化;③ 为设计高安全性、高可靠性的智能微电网控制系统提供理论依据与仿真验证方案。; 阅读建议:本资源侧重于控制策略的设计与仿真验证,建议读者结合微电网基础理论与Simulink仿真技术,深入理解事件触发机制与抗DoS攻击控制算法的实现细节,并动手复现仿真案例以加深对系统动态性能与鲁棒性的认识。
内容概要:本文围绕《【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)》展开,系统阐述了采用粒子群优化算法(PSO)对风能与水力发电系统进行联合优化调度的研究方法与技术路径。研究聚焦于构建多能源互补协调的优化模型,详细论述了目标函数的设计、系统约束条件的处理、算法求解流程及收敛性分析,并通过Matlab编程实现了完整的仿真验证过程,有效提升了可再生能源系统的运行效率与稳定性。该工作属于电力系统智能优化领域,强调对高水平期刊论文的高精度复现,兼具理论深度与工程实用性,适用于科研复现、学术研究与教学参考。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源优化调度、智能算法应用的工程技术人员。; 使用场景及目标:①用于复现《太阳能学报》等高水平期刊中关于风-水电联合调度的EI/SCI论文;②掌握粒子群算法在多源协同优化中的建模、编码与求解关键技术;③辅助完成学位论文、科研项目申报或学术竞赛中的仿真建模任务; 阅读建议:建议结合文中提供的网盘资源下载完整代码与文档资料,按照目录结构循序渐进学习,重点关注算法实现细节、电力系统建模逻辑与参数设置方法,同时可延伸学习灰狼优化算法、YALMIP工具包等先进优化技术,以全面提升科研仿真与创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值