算法日记 - Day7
链表的中间结点核心思想是利用快慢指针一个每次走一格一个每次走两格二者的差距就是整个链表长度的一半classSolution{publicListNodemiddleNode(ListNodehead){ListNodeslowhead,fasthead;while(fast!nullfast.next!null){fastfast.next.next;slowslow.next;}returnslow;}}注意题目中要求有偶数个结点的时候是返回的第二个结点如果是要返回第一个结点怎么办呢classSolution{publicListNodemiddleNode(ListNodehead){// 链表至少一个结点所以 head.next 不会报空指针异常ListNodefast,slow;slowhead;fasthead.next;// 先走一步while(fast!nullfast.next!null){slowslow.next;fastfast.next.next;}returnslow;}}让fast先多走一步相当于slow慢了一步这样slow作为中间节点就变成前面的了。反转链表两种方式一种遍历一种递归遍历的比较好理解遍历相当于是头插法把节点一点点放入另一个比如链表 1→2→3第一轮结束后得到链表 1第二轮结束后得到链表 2→1第三轮结束后得到链表 3→2→1classSolution{publicListNodereverseList(ListNodehead){ListNodecurhead;ListNodeprenull;while(cur!null){ListNodenxtcur.next;cur.nextpre;precur;curnxt;}returnpre;}}然后还可以递归reverseList(head)含义就是从head往下的链表已经反转完成了。相当于是尾插法迭代就是从前往后反转递归是从后往前反转比如 1→2→3→4→5我们反转一半 1→2→3←4←5我们要处理的是已经翻转完的和前面的怎么处理classSolution{publicListNodereverseList(ListNodehead){// head null 的判断是为了兼容一开始链表是空的情况// 实际上只需要 head.next null这是最后一个节点不需要反转作为头节点if(headnull||head.nextnull)returnhead;// 需要把头节点拿到实际上一直都是尾节点ListNodenewHeadreverseList(head.next);// 反转后续节点// 另 head.next 节点指向 headhead.next.nexthead;// 反转成功后head 节点不需要指向任何元素了head.nextnull;returnnewHead;}}当反转到某个中间状态时比如 1→2→3←4←5此时 3 节点的next是可以为空的不需要指向任何节点同时也不需要这个信息了只需向前继续处理让 2←3回文链表想实现O(1)空间复杂度只能改变链表本身的内容找到中间节点反转中间节点后续节点双指针一个从前一个从最后判断值是否相等来判断回文classSolution{publicbooleanisPalindrome(ListNodehead){ListNodemidgetMiddleNode(head);ListNodeendreverse(mid);while(head!nullend!null){if(head.val!end.val)returnfalse;headhead.next;endend.next;}returntrue;}privateListNodegetMiddleNode(ListNodehead){ListNodefast,slow;slowhead;fasthead.next;while(fast!nullfast.next!null){slowslow.next;fastfast.next.next;}returnslow;}privateListNodereverse(ListNodecurr){if(currnull||curr.nextnull)returncurr;ListNodenewHeadreverse(curr.next);curr.next.nextcurr;curr.nextnull;returnnewHead;}}如果我们设计函数可能本身没有这个意图的哈可能我只是需要你判断但是你改动了我的链表。我们可以这么做把数据拷贝到数组里面然后用数组双指针判断是否回文。classSolution{publicbooleanisPalindrome(ListNodehead){ListIntegervalsnewArrayList();ListNodecurrhead;while(curr!null){vals.add(curr.val);currcurr.next;}intfront0,backvals.size()-1;while(frontback){if(!vals.get(front).equals(vals.get(back)))returnfalse;front;back--;}returntrue;}}环形链表这个比较简单快慢指针如果有环的话快慢指针都会进入环并且永远出不去快指针肯定先进去慢指针后进去因为有环快慢指针的距离会慢慢减一所以一定会在环中相遇如果没有环快指针或者快指针下一个节点会为null直接返回false。publicclassSolution{publicbooleanhasCycle(ListNodehead){ListNodeslowhead,fasthead;while(fast!nullfast.next!null){fastfast.next.next;slowslow.next;if(slowfast){returntrue;}}returnfalse;}}环形链表II前面是判断是否为环形链表这里是找入口点前面只要判断出快慢指针在任意位置相遇即可但是相遇位置不一定在入口点但是我们需要先判断是否为环形链表再去找入口点有没有什么规律呢公式推导先定义三个距离ahead到环入口点的距离b环入口点到相遇点的距离c相遇点到环入口点的距离。因此环长为b c。慢指针到相遇点走了a b快指针的速度是慢指针的两倍并且比慢指针多走了完整的n圈至少一圈因此2 ( a b ) − ( a b ) n ( b c ) 2(ab)-(ab)n(bc)2(ab)−(ab)n(bc)化简可得a b n(b c)所以a ( n − 1 ) ( b c ) c \boxed{a(n-1)(bc)c}a(n−1)(bc)c​这说明从head出发走a步刚好到达环入口从相遇点出发走a步相当于先走c步到达入口再绕(n-1)圈最终仍停在入口。因此让一个指针从head出发另一个指针从相遇点出发两者每次都走一步最终一定会在环入口相遇。while(head!slow){headhead.next;slowslow.next;}所以完整代码是publicclassSolution{publicListNodedetectCycle(ListNodehead){ListNodeslowhead,fasthead;while(fast!nullfast.next!null){fastfast.next.next;slowslow.next;if(slowfast){while(head!slow){headhead.next;slowslow.next;}returnslow;}}returnnull;}}合并两个有序链表这个就是两个指针分别遍历两个链表谁值小就加入新链表classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){ListNodeheadnewListNode();// 虚拟头节点ListNodecurrhead;while(list1!nulllist2!null){if(list1.vallist2.val){curr.nextlist1;list1list1.next;}else{curr.nextlist2;list2list2.next;}currcurr.next;}if(list1!null)curr.nextlist1;if(list2!null)curr.nextlist2;returnhead.next;}}这里你注意我们是真正的合并两个链表不是新建了第三个链表。

相关新闻

3步搞定英雄联盟回放:ROFL-Player终极免费解决方案

3步搞定英雄联盟回放:ROFL-Player终极免费解决方案

3步搞定英雄联盟回放:ROFL-Player终极免费解决方案 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟版本更新后…

2026/8/5 1:23:37 阅读更多 →
丙午年六月廿二深夜悟

丙午年六月廿二深夜悟

丙午年六月廿二深夜悟点墨染香绯,瞬悟通古今。本味和风雨,根源连机敏。妄想一疯癫,痴念四时淫。来路明暗中,归途得失心。境界何须问,情志怎知勤?树下光阴行,纸上谈兵临。丽影不惜春,…

2026/8/5 1:23:37 阅读更多 →
《数学少年-从正负号到几何原本》(第二章:“一条直线,万物归数“)--2.5 红黑算筹,千年追溯

《数学少年-从正负号到几何原本》(第二章:“一条直线,万物归数“)--2.5 红黑算筹,千年追溯

第二章 一条直线,万物归数 ——每一条数轴都是一条向前延伸的路。原点是出发的站台,正方向是奔赴的远方。站在原点两侧的数字,互为彼此的镜像。 2.5 红黑算筹,千年追溯 周末的午后,老街旧书店里漫着纸页淡淡的霉香&am…

2026/8/5 1:23:37 阅读更多 →

最新新闻

ZXPInstaller:告别繁琐,3分钟搞定Adobe插件安装的终极方案

ZXPInstaller:告别繁琐,3分钟搞定Adobe插件安装的终极方案

ZXPInstaller:告别繁琐,3分钟搞定Adobe插件安装的终极方案 【免费下载链接】ZXPInstaller Open Source ZXP Installer for Adobe Extensions 项目地址: https://gitcode.com/gh_mirrors/zx/ZXPInstaller 还在为安装Adobe插件而头疼吗?…

2026/8/5 2:11:59 阅读更多 →
Linux账号与权限管理:从基础到高级实践

Linux账号与权限管理:从基础到高级实践

1. Linux账号与权限管理基础概念在Linux系统中,账号和权限管理是系统安全的核心支柱。与Windows系统不同,Linux从设计之初就采用了多用户架构,这使得权限控制变得尤为重要。想象一下,一个办公室里有多个员工共用同一台电脑&#x…

2026/8/5 2:11:59 阅读更多 →
C++实现FTP客户端:从网络编程原理到工程实践

C++实现FTP客户端:从网络编程原理到工程实践

1. 项目概述:为什么用C实现FTP客户端仍有价值?在云存储和HTTP/HTTPS API大行其道的今天,提起用C写一个FTP(文件传输协议)客户端,很多年轻开发者可能会觉得这是“复古”技术。但恰恰相反,深入理解…

2026/8/5 2:11:59 阅读更多 →
STM32WL55 LoRa Rx Duty Cycle模式:低功耗物联网接收的硬件级实现

STM32WL55 LoRa Rx Duty Cycle模式:低功耗物联网接收的硬件级实现

1. 项目概述:理解Rx Duty Cycle模式的核心价值如果你正在用STM32WL55或者SX1261这类LoRa芯片做低功耗物联网项目,那么“Rx Duty Cycle”这个模式绝对是你绕不开的必修课。它不像简单的发送(Tx)或者持续接收(Rx Continu…

2026/8/5 2:11:59 阅读更多 →
VSCode搭建STM32开发环境:从工具链配置到调试烧录全攻略

VSCode搭建STM32开发环境:从工具链配置到调试烧录全攻略

1. 为什么要在 VSCode 里折腾 STM32?先看成本和体验如果你还在用 Keil MDK 或 IAR 做 STM32 开发,每次新建工程、配置路径、处理报错都感觉有点繁琐,那 VSCode 这套方案值得你花半小时试试。它解决的不是“能不能开发”的问题,而是…

2026/8/5 2:11:59 阅读更多 →
负反馈技术进阶:噪声、线性度与阻抗的权衡艺术

负反馈技术进阶:噪声、线性度与阻抗的权衡艺术

1. 从“负反馈”到“性能跃迁”:一个被误解的放大器核心在模拟电路设计的圈子里,负反馈(Negative Feedback)是个老生常谈的话题。几乎每个工程师在入门时都会学到它,知道它能稳定增益、拓宽带宽、减少失真。但很多人&a…

2026/8/5 2:10:58 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →