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

[E单调栈] lc2487. 从链表中移除节点(单调栈+递归+反转链表+多思路)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:2487. 从链表中移除节点

2. 题目解析

本题还是有很多种做法的,题目看到之后就直接采用了 单调栈 处理了下,然后逆序的问题可以采用链表头插法,或者反转链表即可。写完看到题解区还有递归,先反转链表再进行业务处理,等等写法,算法思路不同,可以借鉴学习一下。

反转思路:

  • 先对链表做一下反转。
  • 从右向左遍历链表,找到比当前元素大的节点才加入,否则抛弃当前节点。
  • 最后对链表再做一下反转即可。
  • 可以学习一下官解中,反转链表的简约写法。

递归思路:

  • 既然需要倒着的最大值,那么可以递归处理,递归后的回溯过程,就是从后向前的过程。
  • 如果当前的 head 大于 node,则将 head->next = node 即可。
  • 否则,直接删除 head 节点,return node 节点即可。在下一次回溯的的时候,就将跳过 head 节点。

着重看看递归思路,想一下,如果需要逆序打印链表元素,其实就很容易想到递归了。


  • 时间复杂度 O ( n ) O(n) O(n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode *head) {if (!head) return head;auto a = head, b = a->next;while (b) {auto c = b->next;b->next = a;a = b;b = c;}head->next = NULL;return a;}ListNode* removeNodes(ListNode* head) {stack<int> s;for (auto p = head; p; p = p->next) {while (s.size() && s.top() < p->val) s.pop();s.push(p->val);}ListNode *h = new ListNode(-1), *t = h;while (s.size()) {t = t->next = new ListNode(s.top());s.pop();}return reverseList(h->next);}
};

反转链表简约写法,其实没啥大区别,使用三指针反转链表即可:

    ListNode *reverse(ListNode *head) {ListNode dummy;while (head != nullptr) {ListNode *p = head;head = head->next;p->next = dummy.next;dummy.next = p;}return dummy.next;}

递归写法:

class Solution {
public:ListNode *removeNodes(ListNode *head) {if (head->next == nullptr) {return head;}ListNode *node = removeNodes(head->next); // 返回的链表头一定是最大的if (node->val > head->val) {return node; // 删除 head}head->next = node; // 不删除 headreturn head;}
};

相关文章:

  • 小参林八股
  • C语言一维数组及二维数组详解
  • Java中List集合遍历的N种方法
  • 计算机学生求职简历的一些想法
  • 前端学习<三>CSS进阶——0102-CSS布局样式
  • OpenHarmony实战开发-分布式数据管理
  • vue3从精通到入门6:v-memo指令
  • shell脚本发布nginx vue2 项目示例
  • 设计模式(4):建造者模式
  • 【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心
  • 处理关于 React lazy 白屏的两种方案
  • Linux和Windows安装PHP依赖管理工具Composer
  • 【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。
  • MySQL 优化及故障排查
  • 手机有线投屏到直播姬pc端教程
  • 4个实用的微服务测试策略
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • ES6系列(二)变量的解构赋值
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Mybatis初体验
  • React as a UI Runtime(五、列表)
  • React-flux杂记
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 关于List、List?、ListObject的区别
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前嗅ForeSpider中数据浏览界面介绍
  • 使用API自动生成工具优化前端工作流
  • 我是如何设计 Upload 上传组件的
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • Linux权限管理(week1_day5)--技术流ken
  • ​ubuntu下安装kvm虚拟机
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (20050108)又读《平凡的世界》
  • (bean配置类的注解开发)学习Spring的第十三天
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四) 虚拟摄像头vivi体验
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (转载)OpenStack Hacker养成指南
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .Net Winform开发笔记(一)
  • .net打印*三角形
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @requestBody写与不写的情况
  • [ linux ] linux 命令英文全称及解释
  • [.net]官方水晶报表的使用以演示下载
  • [.NET]桃源网络硬盘 v7.4
  • [Android] 修改设备访问权限