算法日记 - 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/10/13 19:38:41 阅读更多 →
丙午年六月廿二深夜悟

丙午年六月廿二深夜悟

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

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

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

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

2026/9/28 5:46:53 阅读更多 →

最新新闻

Windows平台Rust开发环境配置与优化指南

Windows平台Rust开发环境配置与优化指南

1. Rust语言与Windows环境适配背景Rust作为一门系统级编程语言,其编译器工具链对操作系统底层有着深度依赖。在Windows平台进行Rust开发需要特别注意环境配置的差异性——与Linux/macOS不同,Windows存在MSVC和GNU两种ABI(应用程序二进制接口&…

2026/10/14 2:25:24 阅读更多 →
长波红外超构透镜偏振复用FDTD仿真全流程解析

长波红外超构透镜偏振复用FDTD仿真全流程解析

1. 项目背景与核心价值长波红外超构透镜偏振复用聚焦技术是近年来光学领域的前沿研究方向。作为一名光学工程师,我在实际项目中发现传统红外光学系统存在体积大、重量沉、功能单一等问题。而基于超构表面的偏振复用透镜,能在单层平面上实现多通道光学功能…

2026/10/14 2:25:24 阅读更多 →
2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

2026 查重率和 AIGC 率都飘红?一站式降AI率软件实测推荐

一、前言:2026 高校论文审核新难题随着高校学术审核体系不断升级,知网、维普等主流检测平台全面上线AIGC 智能检测功能,当代毕业生的论文写作与修改迎来双重考验。以往论文仅需攻克重复率超标问题,如今还要规避AI写作痕迹检测风险…

2026/10/14 2:25:24 阅读更多 →
摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱写真儿童摄影的修图、营销与交付(v1.0)

摄影工作室AI提效手册:婚纱、写真、儿童摄影的修图营销与交付版本 v1.0  2026年10月写在前面:这本手册解决什么这本手册写给三类人:开婚纱影楼的老板与修图主管、拍个人写真和家庭照的独立摄影师、做儿童摄影工作室的店长与后期。你大概率已…

2026/10/14 2:25:24 阅读更多 →
流水线设计实战:从冒险机制到乱序执行的性能优化

流水线设计实战:从冒险机制到乱序执行的性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 2:25:24 阅读更多 →
【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

【数据可视化-155】第十五届全运会乒乓球男单半决赛:樊振东VS王楚钦技术分析报告

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

2026/10/14 2:24:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →