代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||
24.两两交换链表中的节点
文章链接:代码随想录 (programmercarl.com)
思路:
(1)首先如果要处理相邻两个节点的话,一定需要操作两个节点的前一个节点才可以,因此,本题需要设定一个虚拟头节点
(2)两两交换节点后,原有的链表就断了,因此需要对链表的节点进行存储
(3)基于此,应该使用双指针,pre指向dummynode(虚拟头节点),cur指向一开始的头节点
(4)注意循环条件,因为涉及到cur.next.next,因此要确保cur和cur.next不为空,否则会报错
Java代码:
/*** 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) {//先判断特殊情况if(head == null){return head;}//定义一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//双指针ListNode pre = dummynode;ListNode cur = head;while(cur != null && cur.next != null){//保存节点2ListNode temp0 = cur.next;//保存节点3ListNode temp1 = cur.next.next;//开始指向节点pre.next = temp0;temp0.next = cur;cur.next = temp1;pre = cur;cur = temp1;}return dummynode.next;}
}
19.删除链表的倒数第N个节点
文章链接:代码随想录 (programmercarl.com)
思路:单指针和双指针(利用对称性)都可以操作,看代码注释,其中双指针代码自己又犯了相同的错误,错误如下
(1)错误1是在最后定位好pre,cur指针位置后,直接就写了pre.next = cur,如果此时链表为[1],那么pre = dummynode,cur = head,此时pre.next = cur,根本就没有删除
(2)错误2是在初始化cur位置后开始同时移动pre和cur时的循环条件写错,应该写成cur.next != null,不然pre指针会多走一个位置
Java代码:(单个指针)
/*** 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) {//先判断特殊情况if(head == null){return head;}//设置一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//定义一个指针ListNode cur = dummynode;//统计链表有多少个节点int size = 0;while(cur != null){cur = cur.next;size++;}//重置指针位置cur = dummynode;//找到要删除的节点的前一个节点for(int i = 0;i < size -1 - n;i++){cur = cur.next;}//保存删除节点的后一个节点ListNode temp = cur.next.next;cur.next = temp;return dummynode.next;}
}
Java代码:(双指针)
/*** 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) {//先判断特殊情况if(head == null){return head;}//设置一个虚拟头节点ListNode dummynode = new ListNode();dummynode.next = head;//双指针ListNode pre = dummynode;ListNode cur = dummynode;//初始化cur指针位置,对称位置for(int i = 0; i < n;i++){cur = cur.next;}//此时开始同时移动pre和cur指针while(cur.next != null){cur = cur.next;pre = pre.next;}//此时pre指针指向要删除节点的前一个节点//这里无需判断pre.next是否为空,因为cur指针在pre后面,前面的while循环已经判断过了ListNode temp = pre.next.next;pre.next = temp;return dummynode.next;}
}
面试题 02.07. 链表相交
文章链接:代码随想录 (programmercarl.com)
思路:
(1)首先先计算两个链表的长度,并且定义两个指针,通过移动指针,让两个链表对齐开始遍历
(2)默认定义指针cur1指向长链表,指针cur2指向短链表
(3)从长度一致的地方开始同时遍历
Java代码:(看代码注释)
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//默认cur1指针指向长链表,cur2指针指向短链表ListNode cur1 = headA;ListNode cur2 = headB;//先计算两个链表的长度int lenA = 0;int lenB = 0;while(cur1 != null){lenA++;cur1 = cur1.next;}while(cur2 != null){lenB++;cur2 = cur2.next;}//计算完长度后,重置一下两个指针cur1 = headA;cur2 = headB;//因为不知道哪个链表更长,因此默认cur1指针指向长链表,cur2指针指向短链表//假设lenB比lenA要长if(lenB > lenA){//先交换长度int templen = lenA;lenA = lenB;lenB = templen;//再交换两个指针ListNode temp = cur1;cur1 = cur2;cur2 = temp;}//开始对齐指针,让长链表的指针往后移动lenA - lenB个步数int gap = lenA - lenB;while(gap > 0){cur1 = cur1.next;gap--;}//此时已经对齐while(cur1 != null && cur2 != null){//有相交的节点if(cur1 == cur2){return cur1;}cur1 = cur1.next;cur2 = cur2.next;}//没有相交的节点return null;}
}
142.环形链表||
文章链接:代码随想录 (programmercarl.com)
思路:此题本质上是个数学题,定义快慢指针,fast指针走过的节点数 = slow指针走过的节点数 * 2
类似于数学上的追逐问题,想要找到节点,首先需要进行画图分析,在获取到x = z这个信息后,就知道了要用双指针来首先找到快慢指针在环中相遇的地方,后面在重新定义一个指针index,让 index 指针以步长1和slow指针依次遍历,两者相遇就找到了环的入口。
Java代码:
/*** 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) {//先判断特殊情况if(head == null){return head;}//定义快慢指针,快指针步长为1,慢指针步长为2ListNode fast = head;ListNode slow = head;//先找到两个指针相遇的节点位置while(slow != null && fast != null && fast.next != null){slow = slow.next;fast = fast.next.next;//找到了两个指针在环内相遇的位置if(slow == fast){ListNode index = head;while(slow != null && index != null){//找到了入环的第一个节点if(slow == index){return index;}index = index.next;slow = slow.next;}}}//没有找到,返回Nullreturn null;}
}
相关文章:
代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||
24.两两交换链表中的节点 文章链接:代码随想录 (programmercarl.com) 思路: (1)首先如果要处理相邻两个节点的话,一定需要操作两个节点的前一个节点才可以,因此,本题需要设定一个虚拟头节点 …...
我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章
我想有很多人开了博客,但想不起来写作,无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容,并将其与您想要编写的内容很好地匹配。 这一次,我…...
嵌入式C语言设计模式 --- 外观模式
1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...
若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】
昨天情人节一( ̄︶ ̄*)) 送给赛利亚一((* ̄3 ̄)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面: 干干净净贼舒服一Ψ( ̄∀ ̄)Ψ——Ψ( ̄∀&#x…...
SCI论文写作神器集合 —— 超级实用
特此声明: 本文拷贝多处别人的内容,并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具,旨在帮助小伙伴们更快更有效率的完成文章发表,如果其他好用的工具,欢迎各位交流~~ 一、文献搜索神…...
MAC 系统安装多版本 JDK 并任意切换
1、背景 在进行 Java 开发的过程中,我们可能需要使用不同版本的 JDK。例如:一些旧的 Java 应用程序只能在旧版本的 JDK 上运行,而一些新的 Java 应用程序需要较新的 JDK 才能运行。 在 MAC 系统上,如何安装多个版本的 JDK 并配置…...
配置 Smart Link 接口时需注意的互斥命令
配置 Smart Link 接口时需注意的互斥命令 一、接口加入Smart Link组功能与以下功能互斥一、接口加入Smart Link组功能与以下功能互斥 注:当接口已经加入Smart Link组,则不能再配置以下功能;反之,当接口已经配置以下功能ÿ…...
QT的下载和安装
这里介绍的是QT官方方式下载,每次都让我很糊涂,就记载一下。先是下载QT online installerhttps://www.qt.io/download 在下方有Go Open Sourcehttps://www.qt.io/download-open-source 在下方有Download the Qt Online installerhttps://www.qt.io/downl…...
nacos配置中心与服务注册中心
文章目录 目录 文章目录 前言 一、服务注册与发现中心 二、配置中心 总结 前言 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一,负责服务注册发现和服务配置. [服务治理的作用和微服务配置管理] Na…...
UE4 手把手教你做插件(1) 从代码引用插件
0,前言 我看的是 技术宅阿棍儿 的视频,B站有。 系列视频:从代码引用插件_哔哩哔哩_bilibili 看不懂,只能边查资料边看,讲的顺序有点乱 1,根据视频提示创建第三方插件 注意:如果只有空白插件的情…...
【Mybatis源码解析】一级缓存和二级缓存源码解析
文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》,主要讲解了Mybatis的基本原理一级执行的流程,这一章来讲一下Mybatis的两个缓存:一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...
你知道MES实施的要点吗?
随着国家行动纲领:中国制造2025(智能制造)的发布,MES系统在制造业的工厂中所占比重越来越大,越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大,生产MES的厂…...
告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢? 为什…...
Redis 命令和Redis key键
Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作,而命令运行的方式是通过客户端命令行来执行的,这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令,您首先需要开启一个 Redis 客户端。操作方法如下: …...
如何入侵服务器
根据中华人民共和国刑法: 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的ÿ…...
在Windows10上安装虚拟机---VMware 17 Pro下载与安装
在Windows10上安装虚拟机---VMware下载与安装0 前言1 下载VMware 17 pro2 安装VMware 17 Pro3. 打开Vmware0 前言 电脑原生系统:Windows10虚拟机软件:VMware 17 pro准备好安装虚拟机的文件夹路径 1 下载VMware 17 pro 下载网址:VMware 官网…...
生命周期函数、组件
1. 生命周期函数 beforeCreate : 无法通过 vm 访问data 中的数据、methods 中的方法created :可以访问 vm 中的 data 的数据, methods 中的方法beforeMount:为经 Vue 编译的 dommounted:经过 vue 编译的 dom &#x…...
蓝桥杯 stm32 PWM 测量频率
本文代码使用 HAL 库。 文章目录 前言一、PWM 原理图:二、CubeMX 创建工程:三、PWM 单路测频:四、详细代码:1. 获取 CNT函数。2. 设置CNT为 0 函数3. 开启TIM2_CH1的输入捕获中断函数4. TIM 回调函数5. 在 LCD 上显示 R40 和 R39 的频率。总结前言 一、PWM 原理图: 参考…...
Docker CPU 资源控制
01-本章背景知识 在生产环境里运行服务的一个主要问题是如何公平有效的进行资源分配。 1、Docker 容器使用核心操作系统的 Cgroups 管理容器的 CPU资源分配。 2、Docker 容器资源竞争时,默认使用简单均分(CFS)算法。 3、Docker 容器也可以根…...
小红书数据平台:笔记爆文率提升的三大秘诀公式!
导语 对于小红书商家 / 博主来说,写出爆文就像买彩票,根本不能预知哪一篇会爆。2023年,小红书哪些内容会脱颖而出呢?我们又该如何把握热点趋势,实现优质内容转化出爆文~ 美妆作为小红书的长红赛道,本文我…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
