当前位置: 首页 > news >正文

剑指offer之反转链表

从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

示例

输入

{67, 0, 24, 58}

返回值

[58, 0, 24, 58]

方法一

直接用简单粗暴的std::reverse()方法直接将List颠倒。

vector<int> printListFromTailToHead(ListNode* head){
  vector<int> res;
  while(head){
    res.push_back(head->val);
    head = head->next;
  }
  std::reverse(res.begin(), res.end());
  return res;
}

方法二

相对于一个数组取反过程,可以考虑使用入栈和出栈操作来实现,顺序读取链表元素存入栈,再将元素出栈存入数组中可以得到一个相反的ArryList,代码如下:

class Solution{
public:
  vector<int> printListFromTailToHead(ListNode* head){
    stack<int> s;
    vector<int> res;
    while(head){
      s.push(head->val);    //将元素入栈
      head = head->next;
    }
    while(!a.empty()){
      res.push_back(s.top); //读取栈顶元素存入vector
      s.pop();              //弹出栈顶元素					
    }
  }
};

方法三

考虑到可以使用反转链表的操作来实现。反转链表的精髓是定义三个指针head,pre,next。首先准备一个pre结点初始指向nullptr,表示正在反转结点的前一个结点,再准备一个cur,表示当前正在反转的结点,cur初始化为head。最后在准备一个next,表示还未反转的下一个结点。

使用如下示意图方便记忆,其中箭头表示等于:

reverse

代码如下:

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        ListNode* next=cur;
        while(cur){
            next = cur->next;
            cur->next = pre;
            pre = cur;
            cur = next;
        }
        vector<int> st;
        while(pre){
            st.push_back(pre->val);
            pre = pre->next;
        }
        return st;
    }
};

相关文章:

  • 剑指offer之重建二叉树、用两个栈实现队列、旋转数组的最小数字
  • 剑指offer(c++)-01.数组中重复的数字
  • 剑指offer(c++)-02.二维数组中的查找
  • 操作系统-01.操作系统的运行机制和体系结构
  • 剑指offer(c++)-03.替换空格
  • 剑指offer(c++)-04.从尾到头打印链表
  • 操作系统-02.中断与异常及系统调用
  • 操作系统-03.进程的定义、组成、组织方式、特征
  • 操作系统-04.进程的状态与切换
  • 操作系统-05.进程控制
  • 操作系统-06.进程通信
  • 操作系统-06.线程概念、多线程模型
  • 操作系统-07.处理机调度概念、层次
  • 设计模式-01.面向对象七大设计原则
  • C++面向对象高级开发-01.C++ 类相关解析
  • 【comparator, comparable】小总结
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • ReactNative开发常用的三方模块
  • redis学习笔记(三):列表、集合、有序集合
  • select2 取值 遍历 设置默认值
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 排序算法学习笔记
  • 前端攻城师
  • 双管齐下,VMware的容器新战略
  • 推荐一个React的管理后台框架
  • 运行时添加log4j2的appender
  • Java总结 - String - 这篇请使劲喷我
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 阿里云服务器如何修改远程端口?
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​香农与信息论三大定律
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • (¥1011)-(一千零一拾一元整)输出
  • (12)目标检测_SSD基于pytorch搭建代码
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Linux+Windows下安装ffmpeg
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)http-server应用
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET业务框架的构建
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @media screen 针对不同移动设备
  • @ModelAttribute注解使用
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 数据结构 - C++]红黑树RBTree
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C++][基础]1_变量、常量和基本类型
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [CTO札记]盛大文学公司名称对联
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf