算法每日一题:从列表中移除节点 | 链表与栈

大家好,我是星恒
今天的题目是一道比较经典的链表题目,他涉及到链表的遍历,链表的创建,处理链表的常用方法,以及常用方法中使用栈的一系列常用技巧
这道题本身不难,但是如果学会处理它,绝对会收获满满!

题目:leetcode 2487
给你一个链表的头节点 head 。
移除每个右侧有一个更大数值的节点。
返回修改后链表的头节点_ head _。
示例:
示例 1:
image.png

输入:head = [5,2,13,3,8]
输出:[13,8]
解释:需要移除的节点是 5 ,2 和 3 。
- 节点 13 在节点 5 右侧。
- 节点 13 在节点 2 右侧。
- 节点 8 在节点 3 右侧。

示例 2:

输入:head = [1,1,1,1]
输出:[1,1,1,1]
解释:每个节点的值都是 1 ,所以没有需要移除的节点。

提示:

  • 给定列表中的节点数目在范围 [1, 105] 内
  • 1 <= Node.val <= 105

分析:
本题我们使用栈的方法来解决,如果大家想了解其他方法,我在下面附了代码

在处理链表时,栈是一种非常常用的技巧,因为处理链表的一个难点,就是链表不容易从后往前访问,而栈恰好具有这种特征(出栈时,后面的先出),所以这不就一拍即合嘛!

这道题也不例外,我们使用栈将链表节点存进来,然后依次出栈,当遇到比结果链表中头结点大的值时,就加入结果链表,更新结果链表的头节点

这道题还有一点不太能想出来(至少我刚开始没想到);我刚开始想的是将链表遍历一遍,然后将比最后一个元素小的值都剔除一遍,然后再遍历剔除后的链表,剔除比倒数第2个值小的值,依次类推,直到剔除到头节点。
但是就没想到可以边加边更新比较的那个值!也就是没有找到第一大值和第二大值的关系!

题解:
方法一:(官方)栈

class Solution {public ListNode removeNodes(ListNode head) {Deque<ListNode> stack = new ArrayDeque<ListNode>();for (; head != null; head = head.next) {stack.push(head);}for (; !stack.isEmpty(); stack.pop()) {if (head == null || stack.peek().val >= head.val) {stack.peek().next = head;head = stack.peek();}}return head;}
}

官方的题解很简洁

  • 将head指针利用到了极致:存栈时,最后返回值时
  • 将整个结点存入栈的思想也很舒服
  • 链表的for循环,学废了吗:for (; head != null; head = head.next)
  • stack.isEmpty(),通常用这个来遍历栈(如果使用stack.size,stack.size是会变的,除非把他声明为变量)

我的题解:

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode removeNodes(ListNode head) {if (head == null) {return new ListNode();}Deque<Integer> stack = new ArrayDeque<>();while(head != null) {stack.push(head.val);head = head.next;}ListNode res = new ListNode(stack.pop());while(!stack.isEmpty()) {int top = stack.pop();if (top >= res.val) {res = new ListNode(top, res);}}return res;}
}

方法二:递归

class Solution {public ListNode removeNodes(ListNode head) {if (head == null) {return null;}head.next = removeNodes(head.next);if (head.next != null && head.val < head.next.val) {return head.next;} else {return head;}}
}

方法三:反转链表

class Solution {public ListNode removeNodes(ListNode head) {head = reverse(head);for (ListNode p = head; p.next != null; ) {if (p.val > p.next.val) {p.next = p.next.next;} else {p = p.next;}}return reverse(head);}public ListNode reverse(ListNode head) {ListNode dummy = new ListNode();while (head != null) {ListNode p = head;head = head.next;p.next = dummy.next;dummy.next = p;}return dummy.next;}
}

如果大家有什么思考和问题,可以在评论区讨论,也可以私信我,很乐意为大家效劳。
好啦,今天的每日一题到这里就结束了,如果大家觉得有用,可以可以给我一个小小的赞呢,我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/324492.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA中自动导包及快捷键

导包设置及快捷键 设置&#xff1a;Setting->Editor->General->Auto import快捷键 设置&#xff1a;Setting->Editor->General->Auto import java区域有两个关键选项 Add unambiguous imports on the fly 快速添加明确的导包 IDEA将在我们书写代码的时候…

Django 7 实现Web便签

一、效果图 二、会用到的知识 目录结构与URL路由注册request与response对象模板基础与模板继承ORM查询后台管理 三、实现步骤 1. terminal 输入 django-admin startapp the_10回车 2. 注册&#xff0c; 在 tutorial子文件夹settings.py INSTALLED_APPS 中括号添加 "the…

【电路笔记】-电感器

电感器 文章目录 电感器1、概述2、电感器的时间常数3、电感器示例1 电感器是一种由线圈组成的无源电气元件&#xff0c;其设计目的是利用电流通过线圈而产生的磁力和电力之间的关系。 1、概述 在本中&#xff0c;我们将看到电感器是一种电子元件&#xff0c;用于将电感引入到电…

算法每日一题: 被列覆盖的最多行数 | 二进制 - 状态压缩

大家好&#xff0c;我是星恒 今天的题目又是一道有关二进制的题目&#xff0c;有我们之前做的那道 参加考试的最大学生数的 感觉&#xff0c;哈哈&#xff0c;当然&#xff0c;比那道题简单多了&#xff0c;这道题感觉主要的考点就是二进制&#xff0c;大家可以好好总结一下这道…

架构(1)

目录 1.如何理解架构的演进&#xff1f; 2.如何理解架构的服务化趋势&#xff1f; 3.架构中有哪些技术点&#xff1f; 4.谈谈架构中的缓存应用&#xff1f; 5.在开发中缓存具体如何实现&#xff1f; 1.如何理解架构的演进&#xff1f; 初始阶段的网站架构应用服务和数据服…

C++学习day--25 俄罗斯方块游戏图像化开发

项目分析 项目演示、项目分析 启动页面 启动页面&#xff1a; 分析&#xff1a; 开发环境搭建 1&#xff09;安装vc2010, 或其他vs版本 2&#xff09;安装easyX图形库 代码实现: # include <stdio.h> # include <graphics.h> void welcome(void) { initgraph(55…

实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次&#xff0c;点赞24次&#xff0c;收藏6次。学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客NeRF 所做的任务是 Novel View Synthesis&#xf…

给新手的25个建议

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

各类Java对象

相关概念的混淆 在某一时间段&#xff0c;人们对某种编程困境感到烦恼&#xff0c;不少人脑中产生了一种新开发方式的概念 一些代表人物提出了他们的意见&#xff0c;而同一时期可能又不少人对同一问题&#xff0c;用自己的不同语言提出不同概念 如果又官方组织维护概念&#x…

vmware安装redhat 7.6 操作系统

vmware安装redhat 7.6 操作系统 1、下载redhat 7.6 操作系统镜像文件2、安装redhat 7.6操作系统3、配置redhat 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载redhat 7.6 操作系统镜像文件 链接: 盘盘 zwzg 文件名&#xff1a;rhel-serv…

主题-----读微信公众号

1.SOA 面向服务的架构&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;还没有一个公认的定义。许多组织从不同的角度和不同的侧面对 SOA 进行了描述&#xff0c;较为典型的有以下三个&#xff1a; &#xff08;1&#xff09;W3C 的定义&#xff1a;SOA 是…

鹿目标检测数据集VOC格式500张

鹿&#xff0c;一种优雅而神秘的哺乳动物&#xff0c;以其优美的外形和独特的生态习性而备受人们的喜爱。 鹿的体型通常中等&#xff0c;四肢细长&#xff0c;身体线条流畅。它们的头部较小&#xff0c;耳朵大而直立&#xff0c;眼睛明亮有神。鹿的毛色因品种而异&#xff0c;…