算法日常记录

1. 链表

1.1 删除链表的倒数第 N 个结点

问题描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

思路:先让fast跑n步,然后slow和fast再一起跑,fast到达末尾时,slow刚好为倒数第n+1个节点,下面代码使用了虚拟结点,所以跑n+1步。
1 -> 2 -> 3 -> 4 -> 5-> null
删除倒数第二个结点,即4;那么要使得3的指针指向5,即3 -> 5,在原链表上表现为 3.next = 3.next.next;
即删除结点的前一个结点 指向 该结点的后一个结点
采用双指针进行完成:快指针移动到n+1的位置后,慢指针开始移动

自测代码:

/*** 删除链表的倒数第 N 个结点* 输入:head = [1,2,3,4,5], n = 2* 输出:[1,2,3,5]** 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; }* }*/
public class RemoveNthFromEnd {public static void main(String[] args) {ListNode head = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(4, new ListNode(5)))));ListNode result = removeNthFromEnd(head,2);ListNode curr = result;while (curr != null) {System.out.println(curr.val);curr = curr.next;}}/*1 -> 2 -> 3 -> 4 -> 5-> null删除倒数第二个结点,即4;那么要使得3的指针指向5,即3 -> 5,在原链表上表现为 3.next = 3.next.next;即删除结点的前一个结点 指向 该结点的后一个结点采用双指针进行完成:快指针移动到n+1的位置后,慢指针开始移动*/private static ListNode removeNthFromEnd(ListNode head, int n) {//为避免要删除结点没有前一个结点,使用虚拟结点指向headListNode dummy = new ListNode(0,head);ListNode fast = dummy;ListNode slow = dummy;//fast结点先移动到n节点的后一个结点位置for (int i = 0; i <= n; i++) {fast = fast.next;}//然后fast和slow结点一起移动,知道fast为nullwhile (fast != null) {fast = fast.next;slow = slow.next;}// 此时 slow 的位置就是待删除元素的前一个位置if(slow.next != null){slow.next = slow.next.next;}return dummy.next;}

力扣代码:

/*** 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 removeNthFromEnd(ListNode head, int n) {//新建一个虚拟头节点指向headListNode dummy = new ListNode(0, head);//快慢指针指向虚拟头节点ListNode fast = dummy;ListNode slow =dummy;//快指针先移动n+1个节点,只要快慢指针相差 n 个结点即可for(int i=0; i<=n;i++){fast = fast.next;}//此时,快慢指针一起移动,快指针为null时,慢指针位于n的前一个节点while(fast != null){fast = fast.next;slow = slow.next;}// 此时 slow 的位置就是待删除元素的前一个位置if(slow.next != null){slow.next = slow.next.next;}return dummy.next;}
}

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

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

相关文章

14使用按钮实现helloworld(1)

目录 还可以通过按钮的方式来创建 hello world 涉及Qt 中的信号槽机制本质就是给按钮的点击操作,关联上一个处理函数当用户点击的时候 就会执行这个处理函数 connect&#xff08;谁发的信号&#xff0c; 信号类型&#xff0c; 谁来处理这个信息&#xff0c; 怎么处理的&…

【Golang】泛型与类型约束

文章目录 一、环境二、没有泛型的Go三、泛型的优点四、理解泛型&#xff08;一&#xff09;泛型函数&#xff08;Generic function&#xff09;1&#xff09;定义2&#xff09;调用 &#xff08;二&#xff09;类型约束&#xff08;Type constraint&#xff09;1&#xff09;接…

k8s常用总结

1. Kubernetes 架构概览 主节点&#xff08;Master&#xff09;&#xff1a; 负责集群管理&#xff0c;包括 API Server、Controller Manager、Scheduler 和 etcd 存储。 工作节点&#xff08;Node&#xff09;&#xff1a; 运行 Pod 和容器&#xff0c;包含 kubelet、kube-pr…

Android 单例模式全解析:从基础实现到最佳实践

单例模式&#xff08;Singleton Pattern&#xff09;是软件开发中常用的设计模式&#xff0c;其核心是确保一个类在全局范围内只有一个实例&#xff0c;并提供全局访问点。在 Android 开发中&#xff0c;单例模式常用于管理全局资源&#xff08;如网络管理器、数据库助手、配置…

ffmpeg滤镜使用

ffmpeg实现画中画效果 FFmpeg中&#xff0c;可以通过overlay将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中&#xff0c;生成画中画的效果 FFmpeg 滤镜 overlay 基本参数 x和y x坐标和Y坐标 eof action 遇到 eof表示时的处理方式&#xff0c;默认为重复。…

OpenAI即将开源!DeepSeek“逼宫”下,AI争夺战将走向何方?

OpenAI 终于要 Open 了。 北京时间 4 月 1 日凌晨&#xff0c;OpenAI 正式宣布&#xff1a;将在未来几个月内开源一款具备推理能力的语言模型&#xff0c;并开放训练权重参数。这是自 2019 年 GPT-2 部分开源以来&#xff0c;OpenAI 首次向公众开放核心模型技术。 【图片来源于…

贪心算法,其优缺点是什么?

什么是贪心算法&#xff1f; 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最优(局部最优)的选择&#xff0c;从而希望导致全局最优解的算法策略。 它不像动态规划那样考虑所有可能的子问题&#xff0c;而是做出局部最优选择&#xff0c;依赖这些选择来…

python string 类型字符拼接 +=的缺点,以及取代方法

在Python中&#xff0c;使用进行字符串拼接虽然语法简单&#xff0c;但在性能和代码维护方面存在明显缺陷。以下是详细分析及替代方案&#xff1a; 一、的缺点 性能低下 内存分配问题&#xff1a;字符串在Python中不可变&#xff0c;每次操作会创建新字符串对象&#xff0c;导…

web前端开发-JS

web前端开发-JS 什么是JavaScript Web标准也称网页标准,由一系列的标准组成,大部分由W3C(World Wide Web Consortium,万维网联盟)负责制定。三个组成部分: HTML:负责网页的结构(页面元素和内容)。CSS:负责网页的表现(页面元素的外观、位置等页面样式,如:颜色、大小等)。JavaS…

Turtle综合案例实战(绘制复杂图形、小游戏)

在学习了 Turtle 基本的绘图技巧后,我们可以通过结合多个概念和技巧,绘制复杂的图形或实现简单的小游戏。本章将介绍两个实战案例: 绘制复杂图形:结合前面所学的知识,绘制一个精美的多层次复杂图案。简单的游戏:利用 Turtle 实现一个简单的小游戏——蛇形游戏,这是一个经…

Python设计模式:克隆模式

1. 什么是克隆模式 克隆模式的核心思想是通过复制一个已有的对象&#xff08;原型&#xff09;来创建一个新的对象&#xff08;克隆&#xff09;。这种方式可以避免重复的初始化过程&#xff0c;从而提高效率。克隆模式通常涉及以下几个方面&#xff1a; 原型对象&#xff1a…

逻辑漏洞之越权访问总结

什么是越权访问漏洞&#xff1f; “越权访问漏洞” 是 “逻辑漏洞” 的一种&#xff0c;是由于网站系统的权限校验的逻辑不够严谨&#xff0c;没有对用户权限进行严格的身份鉴别&#xff0c;导致普通权限的用户做到了其它普通用户或管理员才能完成的操作&#xff0c;称之为“越…

超短波通信模拟设备:增强通信能力的关键工具

在全球信息化战争的背景下&#xff0c;通信系统扮演着至关重要的角色。为确保通信系统的稳定性和抗干扰能力&#xff0c;超短波通信模拟设备应运而生&#xff0c;为军事训练和通信干扰任务提供强大的支持。 设备特点及优势 便携性&#xff1a;设备体积小、重量轻&#xff0c;…

C++STL——容器-vector(含部分模拟实现,即地层实现原理)(含迭代器失效问题)

目录 容器——vector 1.构造 模拟实现 2.迭代器 模拟实现&#xff1a; ​编辑 3.容量 模拟实现&#xff1a; 4.元素的访问 模拟实现 5.元素的增删查改 迭代器失效问题&#xff1a; 思考问题 【注】&#xff1a;这里的模拟实现所写的参数以及返回值&#xff0c;都是…

Ubuntu交叉编译器工具链安装

声明 本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记&#xff0c;&#xff08;内容参照正点原子I.MX6U嵌入式linux驱动开发指南&#xff0c;可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档&#xff09;&#xff0c;旨在如实记录我在学校学…

Tomcat 部署 Jenkins.war 详细教程(含常见问题解决)

在Tomcat中部署Jenkins.war文件是一个相对简单的过程&#xff0c;以下是详细步骤&#xff1a; 1. 准备工作 确保已安装JDK&#xff1a;Jenkins需要Java环境&#xff0c;建议安装JDK 8或更高版本。 下载Jenkins.war&#xff1a;https://pan.quark.cn/s/c4fd7711a1b3 下载Tomc…

DAY46 动态规划Ⅸ 股票问题Ⅱ

188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int maxProfit(int k, vector<int>& prices) {if(prices.size()0) return 0;vector<vector<int>>dp(prices.size(),vector<int>(2*k1,0));for(int i…

4月2日工作日志

一个朴实无华的目录 今日学习内容&#xff1a;1.UIAbility生命周期2.默认启动页面设置3.同模块唤起ability 今日实操内容&#xff1a; 今日学习内容&#xff1a; 1.UIAbility生命周期 2.默认启动页面设置 3.同模块唤起ability 今日实操内容&#xff1a; 通过分组件文件&#…

鸿蒙学习笔记(4)-Radio组件、弹框组件、组件内部状态、工具类

一、Radio组件 &#xff08;1&#xff09;简述 创建单选框组件。接收一个RadioOptions类型对象参数。 名称类型必填说明valuestring是 当前单选框的值。 groupstring是 当前单选框的所属群组名称&#xff0c;相同group的Radio只能有一个被选中。 indicatorType12RadioIndica…

111.在 Vue 3 中使用 OpenLayers 实现动态曲线流动图(类似 ECharts 迁徙状态)

在数据可视化领域&#xff0c;ECharts 提供的 迁徙图&#xff08;流动图&#xff09; 是一种直观展示数据流动的方式&#xff0c;如人口迁徙、物流流向等。我们可以使用 OpenLayers 结合 Vue 3 来实现类似的 动态曲线流动图&#xff0c;从而在 Web GIS 项目中提供更生动的可视化…