LeetCode-链表操作题目
虚拟头指针,在当前head的前面建立一个虚拟头指针,然后哪怕当前的head的val等于提供的val也能进行统一操作
203移除链表元素简单题
/*** 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 removeElements(ListNode head, int val) {//为了统一操作,创建虚拟头指针ListNode fakehead=new ListNode();//虚拟头指针指向head,然后做判断fakehead.next=head;ListNode current=fakehead;while(current.next!=null){//只要头指针的next不是空指针,等于val就删除,不等于就指向下一个指针if(current.next.val==val){current.next=current.next.next;}else{current=current.next;}}return fakehead.next;}
}
建立虚拟头指针fakehead,用空构造函数建造就可以,将fakehead的next指向head
用current指向fakehead开始遍历链表,从head开始进行判断,cur的next的val值和提供的目标值一样就进行移除操作,否则移动指针指向cur的next指针。
707设计链表中等题
这道题非常考察链表的基本操作,沿用203题,为了进行单链表的统一操作,本题用虚拟头结点
class MyLinkedList {//构建链表ListNodeclass ListNode{int val;ListNode next;ListNode(int val){this.val=val;}}//建立虚拟头结点private ListNode fakehead;//记录链表总长度private int nodelen;public MyLinkedList() {this.fakehead=new ListNode(0);this.nodelen=0;}public int get(int index) {//查找下标为index的valif(index<0 || index>=nodelen){return -1;}ListNode current=fakehead;//找到index+1for(int i=0;i<=index;i++){ current=current.next;}return current.val;}public void addAtHead(int val) {//虚拟头指针后面增加一个元素ListNode newnode=new ListNode(val);newnode.next=fakehead.next;fakehead.next=newnode;nodelen++;}public void addAtTail(int val) {//因为要在尾巴插入,所以要记录链表的总长度ListNode newnode=new ListNode(val);ListNode current=fakehead;while(current.next!=null){current=current.next;}//现在指向最后的元素了current.next=newnode;nodelen++;}public void addAtIndex(int index, int val) {if(index<0 || index>nodelen){return;}ListNode newnode=new ListNode(val);ListNode current=fakehead;//插入到index前面for(int i=0;i<index;i++){current=current.next;}newnode.next=current.next;current.next=newnode; nodelen++; }public void deleteAtIndex(int index) {if(index<0 ||index>=nodelen){return;}ListNode current=fakehead;for(int i=0;i<index;i++){current=current.next;}current.next=current.next.next;nodelen--;}
}
- 首先为了初始化链表,我们需要写一个链表类,然后定义两个成员变量fakehead(虚拟头指针)和nodelen(链表中元素的个数),初始化的时候fakehead定义为val为0的链表元素,nodelen为0
- 根据索引index去get一个元素的val值,首先要判断index是不是小于0或者大于等于nodelen(当前的元素值索引最大只能是nodelen-1),然后从i=0遍历到index+1就可以,因为是从虚拟头结点开始遍历的
- 在第一个元素添加很简单,就是虚拟头指针原来的next变为新添加元素的next,虚拟头指针的next指向新添加元素就可以了
- 在尾部添加元素,只需要一直遍历指针指向最后一个元素然后next设为新添加元素
- 给定索引index和val,在index元素的前面插入新元素,我们需要找到前置链表元素的位置,然后进行添加操作,用for循环遍历的时候,就需要遍历到index-1下标的元素位置
206反转链表简单题
/*** 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 reverseList(ListNode head) {//一次翻转,用双指针,从头开始遍历ListNode pre=null;ListNode cur=head;//交换用ListNode temp=null;//前置指针先指向nullwhile(cur!=null){temp=cur.next;cur.next=pre;pre=cur;cur=temp;}return pre;}
}
双指针思想,设置pre为前置指针,让cur一直指向pre,就相当于反转了链表
注意:pre循环的时候要指向cur,而cur为了能指向本来的next,需要建立一个链表指针temp来保存
24两两交换链表中的节点 中等
虚拟头指针+两个temp链表进行交换
/*** 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 swapPairs(ListNode head) {//建立一个虚拟头指针ListNode fake=new ListNode();fake.next=head;ListNode cur=fake;ListNode temp1=new ListNode();ListNode temp2=new ListNode();while(cur.next!=null && cur.next.next!=null){//满足交换条件temp1=cur.next;temp2=cur.next.next.next;//f-ccur.next=cur.next.next;//f-2-1cur.next.next=temp1;//f-2-1-3cur.next.next.next=temp2;cur=temp1;}return fake.next; }
}
19删除链表的倒数第N个节点 中等
/*** 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) {//虚拟头指针ListNode fake=new ListNode();fake.next=head;//设置双指针ListNode slow=fake;ListNode fast=fake;//先让fast移动到第n个位置for(int i=0;i<n;i++){fast=fast.next;}//再两个一起移动while(fast.next!=null){fast=fast.next;slow=slow.next;}//删除slow后面的节点slow.next=slow.next.next;return fake.next;}
}
用快慢双指针完成这个问题,虚拟头指针方便统一操作,slow的下一个指标对应的元素就是要删除的元素
142环形链表
/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode detectCycle(ListNode head) {//检查有没有环,快慢指针,快指针移动两个元素,慢指针一次移动一个元素,如果有环一定会相遇ListNode fast=head;ListNode slow =head;while(fast!=null && fast.next!=null){slow=slow.next;fast=fast.next.next;if(slow==fast){//相遇了,记录相遇节点ListNode index1=slow;//设入口到head距离为x,环入口到相遇节点为y,相遇节点到入口的节点数是z//则有2(x+y)=x+y+n(y+z)等价于x=n(y+z)-y等价于x=(n-1)(y+Z)+z//由于n至少转了一圈以上,fast才能够追上slow,所以只要一个指针从head出发,一个指针从相遇节点出发,最终相遇的地方就是环的路口ListNode index0=head;while(index0!=index1){index0=index0.next;index1=index1.next;}return index0;}}return null;}
}
- 快慢指针入手,快指针每次移动两个下标,慢指针每次移动一个,如果有环,必定相遇,由于快指针每次移动两个,所以while循环的条件是他现在和next都不为null
- 如何判断出口,就要用数学公式进行判断,根据相遇的时候,快指针移动节点的个数是慢指针移动节点个数的二倍,列出等价公式,得到x=(n-1)(y+z)+z
- 这说明从相遇节点出发无论快指针是走了一圈y+z的路程还是很多圈,最终都会和从head出发的指针相遇,而这个相遇的地点就是环的入口指针
- xyz示意图
相关文章:

LeetCode-链表操作题目
虚拟头指针,在当前head的前面建立一个虚拟头指针,然后哪怕当前的head的val等于提供的val也能进行统一操作 203移除链表元素简单题 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(…...

【ARM】MDK浏览信息的生成对于构建时间的影响
1、 文档目标 用于了解MDK的代码浏览信息的生成对于工程的构建是否会产生影响。 2、 问题场景 客户在MDK中使用Compiler 5对于工程进行构建过程中发现,对于是否产生浏览信息会对于构建时间产生一定的影响。在Options中Output栏中勾选了Browse Information后&#…...
Python模块中__all__变量失效问题深度解析
文章目录 Python模块中__all__变量失效问题深度解析一、__all__ 的正确作用场景二、__all__ 不起作用的常见原因1. 未使用 from ... import \* 导入2. __all__ 定义不完整或错误3. 子模块未正确导出4. Python 解释器缓存问题5. 相对导入路径错误 三、解决方案1. 确保使用 from …...

py爬虫的话,selenium是不是能完全取代requests?
selenium适合动态网页抓取,因为它可以控制浏览器去点击、加载网页,requests则比较适合静态网页采集,它非常轻量化速度快,没有浏览器开销,占用资源少。当然如果不考虑资源占用和速度,selenium是可以替代requ…...

docker B站学习
镜像是一个只读的模板,用来创建容器 容器是docker的运行实例,提供了独立可移植的环境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目录挂载 尚硅谷doc…...

SpringBoot高校宿舍信息管理系统小程序
概述 基于SpringBoot的高校宿舍信息管理系统小程序项目,这是一款非常适合高校使用的信息化管理工具。该系统包含了完整的宿舍管理功能模块,采用主流技术栈开发,代码结构清晰,非常适合学习和二次开发。 主要内容 这个宿舍管理系…...
深度解析 Dockerfile 配置:构建高效轻量的FastAPI 应用镜像
目录 引言 Dockerfile构建FastAPI镜像的示例 一、基础镜像选择:轻量与安全优先 二、元数据声明:镜像维护者信息 三、依赖管理:分层构建与缓存优化 1. 复制依赖文件 2. 安装依赖 四、应用代码复制:最小化镜像内容 五、启动…...

ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测
阿尔兹海默病(Alzheimers Disease, AD)是一种以认知能力下降和记忆丧失为特征的渐进性神经退行性疾病,及早发现对于其干预和治疗至关重要。近期,清华大学语音与音频技术实验室(SATLab)提出了一种将停顿信息…...
[蓝桥杯]春晚魔术【算法赛】
目录 输入格式 输出格式 样例输入 样例输出 运行限制 解决思路 代码说明 复杂度分析 问题描述 在蓝桥卫视春晚的直播现场,魔术师小蓝表演了一个红包魔术。只见他拿出了三个红包,里边分别装有 A、B 和 C 个金币。而后,他挥动魔术棒&a…...
LeetCode - 965. 单值二叉树
目录 题目 深度优先搜索方法 正确的写法 题目 965. 单值二叉树 - 力扣(LeetCode) 深度优先搜索方法 什么是深度优先搜索:深度优先搜索(DFS)是一种图或树的遍历算法,它从起始节点开始,尽可能深地沿着一条路径探索&…...

LabVIEW杂草识别与精准喷洒
基于LabVIEW构建了一套集成机器视觉、智能决策与精准控制的农业杂草识别系统。通过高分辨率视觉传感器采集作物图像,利用 LabVIEW 的 NI Vision 模块实现图像颜色匹配与特征分析,结合 Arduino 兼容的工业级控制硬件,实现杂草定位与除草剂精准…...
分布式不同数据的一致性模型
1. 强一致性(Strong Consistency) 定义:所有节点在任何时间点看到的数据完全一致,读操作总是返回最近的写操作结果。特点: 写操作完成后,所有后续读操作都能立即看到更新。通常需要同步机制(如…...
“application/json“,“text/plain“ 分别表示什么
这两个字符串:“application/json” 和 “text/plain” 是 MIME 类型(媒体类型),用于告诉接收方消息内容的格式,它们出现在 ContentType 字段中。 它告诉系统或程序:“这段数据是什么格式?” 格…...
SQL: 窗口滑动(Sliding Window)
目录 什么是“窗口”? 什么是“滑动”? 🔍 滑动窗口的核心: 🕒 什么是时间窗口?(Time Window) 时间窗口的基本结构 时间窗口的三种常见形式 📊 什么是行窗口&…...

学习日记-day20-6.1
完成目标: 知识点: 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…...

【音视频】 FFmpeg 解码H265
一、概述 实现了使用FFmpeg读取对应H265文件,并且保存为对应的yuv文件 二、实现流程 读取文件 将H265/H264文件放在build路径下,然后指定输出为yuv格式 在main函数中读取外部参数 if (argc < 2){fprintf(stderr, "Usage: %s <input file&…...
Linux 系统 Docker Compose 安装
个人博客地址:Linux 系统 Docker Compose 安装 | 一张假钞的真实世界 本文方法是直接下载 GitHub 项目的 release 版本。项目地址:GitHub - docker/compose: Define and run multi-container applications with Docker。 执行以下命令将发布程序加载至…...

软件测试|FIT故障注入测试工具——ISO 26262合规下的智能汽车安全验证引擎
FIT(Fault Injection Tester)是SURESOFT专为汽车电子与工业控制设计的自动化故障注入测试工具,基于ISO 26262等国际安全标准开发,旨在解决传统测试中效率低、成本高、安全隐患难以复现的问题,其核心功能包括…...

3D拟合测量水杯半径
1,目的。 测量水杯的半径 如图所示: 2,原理。 对 3D 点云对象 进行圆柱体拟合,获取拟合后的半径。 3,注意事项。 在Halcon中使用fit_primitives_object_model_3d进行圆柱体拟合时,输出的primitive_para…...
(21)量子计算对密码学的影响
文章目录 2️⃣1️⃣ 量子计算对密码学的影响 🌌🔍 TL;DR🚀 量子计算:密码学的终结者?⚡ 量子计算的破坏力 🔐 Java密码学体系面临的量子威胁🔥 受影响最严重的Java安全组件 🛡️ 后…...

Python训练打卡Day38
Dataset和Dataloader类 知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 在遇到大规模数据集时,显存常常无法一次性存储所有数据,所以需要使用分批训练的…...

Selenium基础操作方法详解
Selenium基础操作方法详解:从零开始编写自动化脚本(附完整代码) 引言 Selenium是自动化测试和网页操作的利器,但对于新手来说,掌握基础操作是成功的第一步。本文将手把手教你使用Selenium完成浏览器初始化、元素定位、…...
Kali Linux从入门到实战:系统详解与工具指南
一、Kali Linux简介 Kali Linux是一款基于Debian的Linux发行版,专为渗透测试和网络安全审计设计,由Offensive Security团队维护。其前身是BackTrack,目前集成了超过600款安全工具,覆盖渗透测试全流程,是网络安全领域…...
【大模型】Bert变种
1. RoBERTa(Robustly optimized BERT approach) 核心改动 取消 NSP(Next Sentence Prediction)任务,研究发现 NSP 对多数下游任务贡献有限。动态遮蔽(dynamic masking):每个 epoch …...
vue-09(使用自定义事件和作用域插槽构建可重用组件)
实践练习:使用自定义事件和作用域插槽构建可重用组件 构建可重用的组件是高效 Vue.js 开发的基石。本课重点介绍如何通过自定义事件和范围插槽来增强组件的可重用性,从而实现更灵活和动态的组件交互。我们将探索如何定义和发出自定义事件,使…...

简单三步FastAdmin 开源框架的安装
简单三步FastAdmin 开源框架的安装 第一步:新建站点1,在宝塔面板中,创建一个新的站点,并填写项目域名。 第二步:上传框架1,框架下载2,上传解压缩 第三步:配置并安装1,进入…...

RISC-V 开发板 MUSE Pi Pro 搭建 Spacengine AI模型部署环境
视频讲解: RISC-V 开发板 MUSE Pi Pro 搭建 Spacengine AI模型部署环境 Spacengine 是由 进迭时空 研发的一套 AI 算法模型部署工具,可以方便的帮助用户部署自己的模型在端侧, 环境部署的方式,官方提供了两种方式: do…...
C++面试5——对象存储区域详解
C++对象存储区域详解 核心观点:内存是程序员的战场,存储区域决定对象的生杀大权!栈对象自动赴死,堆对象生死由你,全局对象永生不死,常量区对象只读不灭。 一、四大地域生死簿 栈区(Stack) • 特点:自动分配释放,速度极快(类似高铁进出站) • 生存期:函数大括号{}就…...

【Unity】AudioSource超过MaxDistance还是能听见
unity版本:2022.3.51f1c1 将SpatialBlend拉到1即可 或者这里改到0 Hearing audio outside max distance - #11 by wderstine - Questions & Answers - Unity Discussions...
基于 51 单片机的智能饮水机控制系统设计与实现
一、引言 随着物联网技术的发展,传统家电的智能化升级成为趋势。本文提出一种基于 51 单片机的智能饮水机设计方案,实现水温精准控制、水位监测、人机交互等功能,具有成本低、稳定性高的特点,适用于家庭和小型办公场景。 二、硬件设计 2.1 核心芯片选型 单片机:选用STC…...