LeetCode热题100链表专题:虚拟头节点与双指针全解法突破
1. 项目概述hot100 链表专题到底在考什么先说实话链表这玩意每次刷题都觉得“这也不难啊”但一到面试手写翻车率奇高。热题100 里的链表专题我前前后后刷了三轮每一次都有新体会。这个专题说白了一共就那么二三十道题但覆盖了算法面试里链表方向的全部核心考点指针操作、边界处理、递归思维、双指针技巧外加一道排序和一道设计题作为综合拔高。这篇文章主要面向两类人一类是刚开始刷题、对链表又爱又怕的初学者另一类是刷过一轮但总在细节上栽跟头的复习者。我会把热题100里链表专题的所有题型拆开揉碎讲清楚每类题的底层套路、代码模板、时间复杂度的来龙去脉还有我实际刷题过程中踩过的坑和总结出来的独家技巧。目标很单纯让这个专题成为你面试时最有把握的部分而不是最心虚的部分。先说结论链表题的核心难点不在算法思想上而在“指针操作的准确性”。数组题你可以靠下标访问链表题你必须靠指针一步一步挪一旦出现空指针访问或者指针丢失整个程序就崩了。所以这个专题的正确打开方式不是“多刷题”而是“建立模板思维把操作固化成肌肉记忆”。2. 内容整体设计与思路拆解为什么链表题目看起来简单却总做错2.1 链表和数组的本质差异决定了思维方式必须改变我见过太多人拿数组的思维去写链表题这就是翻车的根源。数组是连续内存支持O(1)随机访问你要处理某个位置直接arr[i]就完事了。链表是离散节点每个节点只知道自己和后继节点你要访问第i个节点必须从头开始next走i次没有任何捷径。这个差异带来的第一个影响是链表题的“算法复杂度”往往不是瓶颈瓶颈是“你怎么用指针把算法落地”。举个例子反转链表这题思想层面两三句话就说完了——把每个节点的next指向前一个节点。但真写起来你要同时维护前驱节点、当前节点、后继节点三个指针顺序稍微一乱链表就断了。再举个例子删除链表的倒数第N个节点。数组里删除倒数第N个直接下标定位一行代码搞定。链表里你不知道长度要么先遍历一遍求长度要么用双指针一前一后同时走。这就是链表题的一个核心主题由于缺乏随机访问能力所有需要“定位”的操作都得靠指针移动额外技巧来完成。我在刷这个专题时反复提醒自己一句话链表题不是考你“知不知道怎么做”而是考你“能不能用代码把思路无歧义地表达出来”。所以思路拆解不能只停留在“这题我懂”必须落实到“每一行代码我都知道为什么这么写”。2.2 热题100链表专题的题型分布与能力要求热题100里的链表题我按考察方向分了六类题型分类代表题目核心考察点难度评级反转类反转链表、反转链表II指针翻转、递归思维基础到中等删除类删除倒数第N个、删除排序链表重复元素虚拟头节点、双指针基础到中等环与交点类环形链表、相交链表快慢指针、Floyd判圈中等合并与拆分合并两个有序链表、合并K个有序链表归并思想、优先队列中等排序类排序链表分治归并找中点中等偏难综合设计类LRU缓存哈希表双向链表偏难这个分布很有意思。热题100没有把链表的所有考点都塞进去比如它没有单独的“链表复制”题也没有“链表加法”题但这些题的解题技巧比如HashMap记录节点映射、递归处理进位会在其他题的综合解法里用到。我更想强调的是能力要求的变化。反转链表这类基础题考察的是你能不能把三指针翻转写对环形链表考察的是你懂不懂Floyd判圈背后的数学原理不仅仅是背模板排序链表则综合考察了找中点快慢指针、合并两个有序链表归并、递归分解分治一道题顶三道。所以在刷题策略上我的建议是按这个分类顺序推进每一类都吃透了再进入下一类不要跳跃式刷题。2.3 为什么说虚拟头节点是链表题的“万能安全垫”在拆解具体解法之前我想先讲一个贯穿所有删除类、插入类题目的技巧虚拟头节点dummy node。很多链表操作的痛点是如果操作的是第一个节点头节点本身可能被修改或被删除导致返回值变得难以维护。比如删除链表头节点你要重新指定head head.next但如果你是在一个循环里根据某个条件来决定是否删头节点这个“头节点变了”的逻辑就容易写乱。虚拟头节点的做法非常简单new一个节点让它的next指向head然后所有操作都从这个虚拟节点开始最后返回dummy.next。这样做的好处有两个第一头节点不再是特殊节点它和普通节点的操作统一了。你要删除哪个节点只需要找到它的前驱让前驱的next跳过它不需要额外判断是不是头节点。第二你的返回值永远是dummy.next不管链表头怎么变这个返回值都能正确指向新的头节点。我在删除倒数第N个节点、删除排序链表中的重复元素、反转链表II这几道题里都强烈建议用虚拟头节点。注意虚拟头节点只是逻辑上的辅助节点它不参与业务数据。操作完成后要记得返回dummy.next而不是返回dummy本身。我第一次写的时候直接return dummy结果输出多了一个节点排查了半天。3. 核心细节解析与实操要点六类题型的通用解法模板3.1 反转类题目三指针迭代法 递归法反转链表是链表专题的“hello world”也是后续很多题的基础。比如回文链表需要先反转一半反转链表II需要在指定区间内反转。最经典的迭代写法是三指针法。我们需要三个指针prev前驱、cur当前、next后继。每轮循环做三件事先用next保住cur的后继然后让cur.next指向prev接着prev和cur各自前移一步最后prev指向的就是反转后的新头节点。def reverseList(self, head: ListNode) - ListNode: prev None cur head while cur: next_node cur.next # 第一步保存后继否则下一步就丢了 cur.next prev # 第二步翻转指针 prev cur # 第三步prev前移 cur next_node # 第四步cur前移 return prev很多初学者不理解为什么要先用next_node把后继存起来。原因是当执行cur.next prev之后cur原来的后继就再也访问不到了。如果不提前保存链表就在这一步断成两截后面的节点全部丢失。时间复杂度O(n)空间复杂度O(1)这是迭代法最大的优势。递归法写法更简洁但空间复杂度是O(n)因为递归栈要保存每一层的状态。面试时如果没特别说明我建议优先写迭代法省空间且不容易爆栈。递归法的核心逻辑是假设从某个节点之后的部分已经反转好了那当前节点要做的就是让head.next.next head然后断开head.next。这个思路非常优雅但新手很容易绕进去。我个人的体会是递归反转链表本来就是一道“背模板”题你要么彻底理解了要么先迭代法保底别在考场上临场推递归。3.2 删除类题目虚拟头节点 双指针定距删除类题目在热题100里出现频率不低核心就一句话删除某个节点本质上就是让它的前驱跳过它。所以问题的关键永远是“如何找到前驱”。删除倒数第N个节点这题最常见也最优的解法是双指针定距法。思路是先用一个指针从头走N步然后另一个指针从头和它一起走当前面的指针走到链表末尾时后面的指针恰好停在倒数第N1个节点也就是待删节点的前驱。def removeNthFromEnd(self, head: ListNode, n: int) - ListNode: dummy ListNode(0, head) fast dummy slow dummy for _ in range(n 1): # 先让fast走n1步 fast fast.next while fast: fast fast.next slow slow.next slow.next slow.next.next # 跳过待删节点 return dummy.next这里有两个细节容易出错。第一fast到底先走n步还是n1步如果你要slow最终停在待删节点的前驱那fast和slow之间应该隔n1个节点fast到slow的距离是n1步所以fast要先走n1步。第二为什么用dummy因为如果要删的恰好是头节点slow需要落在dummy上才能执行跳过操作否则头节点没法删。删除排序链表中的重复元素II这题稍微复杂一点因为要求重复的元素一个都不留。这时候不能用“保留一个”的思路而是要用一个指针pre指向“当前确定不重复的前驱”然后用cur去扫描遇到一段重复的就整体跳过。我在做这题时的经验是把“重复段”看成一个整体。cur和cur.next的值一样就一直往后走直到cur指向这一段重复值的最后一个节点然后让pre.next cur.next把整段都跳过。这个理解和“只删多余的重复项”完全不同思维不在一个频道上。第一次写的时候我就犯了这个错只删了中间的重复项首尾的重复项还在一提交就报错。3.3 环与交点类题目Floyd判圈与哈希表路径记录环形链表和相交链表这两道题可以说是双指针技巧的巅峰应用。环形链表的经典解法是快慢指针也叫Floyd判圈算法。慢指针每次走一步快指针每次走两步如果链表有环两个指针一定会在环内相遇。这个结论很多人背下来了但不知道为什么。从相对运动的角度来想快指针每次比慢指针多走一步相当于慢指针不动、快指针以“每轮一步”的速度在追赶慢指针。如果链表有环快指针追到慢指针是迟早的事因为环是有限的且无出口如果链表无环快指针会先走到null循环自然结束。这个“快指针先走”的思路还能扩展到环形链表II找出环的入口。当两个指针第一次相遇时把其中一个指针移回head然后两个指针都改为每次走一步再次相遇的位置就是环的入口。这个结论也是可以数学证明的但在实际操作里我更建议把它当模板记忆毕竟面试不会让你现场推公式但会考你是否知道这个性质。相交链表这题有个很经典的解法双指针交替遍历两条链表。pA走完headA后就切到headB走pB走完headB后就切到headA走。如果两条链表相交那么pA和pB会在相交节点相遇如果不相交它们会在同时走到null的时候结束都走了lenAlenB步。我刚开始做相交链表的时候用的是哈希表解法先存下headA的所有节点然后遍历headB逐个判断是否在哈希表里。代码确实好写但空间复杂度是O(m)或者O(n)不符合最优解要求。面试官问“能不能优化空间”的时候我一时没反应过来后来才意识到双指针交替走才是标准答案。所以做这道题的时候我强烈建议直接练双指针解法省得一上来就依赖哈希表。3.4 合并类题目迭代合并与优先队列合并两个有序链表是链表专题的“基本功”合并K个有序链表则是在这个基本功之上的分治或堆应用。两个有序链表的合并用迭代法加虚拟头节点非常清晰。谁小就接谁接完继续走最后把没走完的链表整体接上。边界条件别忘如果有一条链表已经为空直接返回另一条即可。def mergeTwoLists(self, list1: ListNode, list2: ListNode) - ListNode: dummy ListNode(0) cur dummy while list1 and list2: if list1.val list2.val: cur.next list1 list1 list1.next else: cur.next list2 list2 list2.next cur cur.next cur.next list1 if list1 else list2 return dummy.next合并K个有序链表直观想法是每次选K个头节点里最小的那个但这样每选一个节点都要比较K次总复杂度太高。我用堆优先队列来优化先把所有链表的头节点丢进堆里每次弹出最小的节点然后把它的后继节点再丢进堆里。这样每次取节点的时间是O(logK)总共处理N个节点总复杂度O(NlogK)空间复杂度O(K)。分治合并是另一种解法思路和归并排序一致把K个链表两两合并合并完一轮只剩K/2个再继续两两合并。分治合并的时间复杂度同样是O(NlogK)但空间复杂度是O(logK)递归栈。两种方案我都写过面试时看情况选。如果K比较小分治法代码更直白如果K很大堆的稳定性更好。这里有个实操小技巧往堆里存值, 节点的时候如果值相同堆会比较节点对象的大小但在某些语言里节点不可比较会直接报错。稳妥的做法是往堆里存三元组值, 序号, 节点用序号做次级比较避免节点比较问题。这个坑我踩过在某次笔试里整个程序crash了原因就是堆里两个节点的值相同比较器报错。3.5 排序类题目排序链表背后是“三个基本功的缝合”排序链表这题要求时间复杂度O(nlogn)且空间复杂度O(1)这就排除了数组辅助排序。标准解法是自顶向下的归并排序链表版本需要解决三个问题如何找中点、如何合并两个有序链表、如何递归分解。找中点用快慢指针快指针每次走两步慢指针每次走一步快指针到末尾时慢指针就在中点。这里有个细节需要记录中点前一个节点然后把链表从中间断开否则递归处理左右两半时会出现循环。我之前写的时候没有断开就直接递归结果两个链表永远分不开递归直接爆栈。def sortList(self, head: ListNode) - ListNode: if not head or not head.next: return head # 1. 找中点并断开链表 slow, fast head, head.next while fast and fast.next: slow slow.next fast fast.next.next mid slow.next slow.next None # 2. 递归排序左右两半 left self.sortList(head) right self.sortList(mid) # 3. 合并两个有序链表 return self.mergeTwoLists(left, right)注意这里fast初始化成head.next而不是head这是为了保证当链表只有两个节点时slow停在第一个节点而不是第二个节点否则断开会把链表分成空和一个递归永远没法收敛。自底向上的归并排序可以实现真正的O(1)空间复杂度但代码量明显更大需要自己控制步长和断链面试中很少被要求到这一步。我的建议是先把自顶向下的版本写熟练能吃透它的时间复杂度推导即可。时间复杂度O(nlogn)的由来每一层归并要遍历所有节点O(n)归并排序递归层数是O(logn)所以总复杂度O(nlogn)。这个推导过程面试常问要能说出来。3.6 综合设计类LRU缓存背后的双向链表思维热题100链表专题的压轴题是LRU缓存这道题考察的不是单一的指针技巧而是你对“哈希表双向链表”这个组合数据结构的理解深度。LRULeast Recently Used的核心思想是当缓存满时优先淘汰最久没被访问的数据。要支持O(1)的get和put操作哈希表负责快速定位节点双向链表负责维护访问顺序。每次get或put一个key就把对应节点移动到链表头部链表尾部的节点就是最久未使用的需要淘汰时直接删除尾节点。为什么用双向链表而不是单向链表因为删除一个节点需要知道它的前驱单向链表找到前驱需要从头遍历做不到O(1)。双向链表每个节点都存了prev指针删任何一个节点都是O(1)。我在实现这个数据结构时的心得是先把“辅助函数”写清楚这个方法负责从链表中摘除节点再写“移动到头部”的方法它内部先调用移除再插入头部。get和put只需要调用这两个辅助函数逻辑会清晰很多。如果你直接在get里写一遍链表操作、put里又写一遍代码会重复且容易出错。4. 实操过程与核心环节实现从零到一的手写代码能力训练4.1 环境准备与刷题顺序建议链表专题不需要什么复杂的开发环境一个支持断点调试的编辑器就够用了。我平时用的是本地IDE写代码跑测试用例再用断点看每一步的指针指向。这里有个很特别的操作while循环里在cur.next prev这一行打断点然后单步执行看cur、prev、next_node三个变量在每一轮的变化。这个练习我强烈建议新手做一遍比我讲一百句话都管用。刷题顺序按难度递进是这样排的反转链表吃透迭代和递归两种写法合并两个有序链表吃透迭代合并删除链表倒数第N个节点吃透虚拟头节点双指针环形链表吃透快慢指针相交链表吃透双指针交替走反转链表II吃透区间反转删除排序链表中的重复元素II吃透“跳整段”环形链表II吃透找环入口排序链表综合套用LRU缓存进阶训练别跳着刷。比如你还没掌握反转链表就直接去刷回文链表会发现自己卡在“怎么把后半段反转回来”这一步代码逻辑全乱。基础题目的熟练度直接决定综合题目的做题速度。4.2 一个完整的实操案例反转链表II的逐步推演我以反转链表II为例完整走一遍实操过程。题目是给一个链表和左右边界left、right要求只反转从第left个节点到第right个节点之间的部分。这题是反转链表的加强版考察的是“区间反转前后连接”特别能检验对虚拟头节点的理解。第一步因为头节点可能参与到反转区间中我们先建虚拟头节点dummy ListNode(0, head)。同时准备一个指针pre dummy让它先走left-1步走到待反转区间的前驱节点。这里我建议你在草稿纸上画一下pre最终应该指向的是第left-1个节点。第二步从 pre 的下一个节点开始反转right-left1个节点。由于我们知道反转长度可以做固定次数的翻转。这个翻转过程和反转整条链表是一样的每次取当前开头的一个节点把它移动到pre之后。我贴出核心代码圈出关键行def reverseBetween(self, head: ListNode, left: int, right: int) - ListNode: dummy ListNode(0, head) pre dummy # 1. 让pre走到left-1的位置 for _ in range(left - 1): pre pre.next # 2. 对区间内的节点做头插式反转 cur pre.next for _ in range(right - left): next_node cur.next cur.next next_node.next next_node.next pre.next pre.next next_node return dummy.next这段代码的核心是“头插法”的思路。你维护一个cur指针始终指向区间内第一个未被反转的节点然后把cur后面的节点逐个拔出来插到pre后面。每插一个节点pre.next就指向这个新插进来的节点。整个过程不需要像整条链表反转那样维护prev指针而是固定pre、动后面的节点。我最初写这题时用了一个笨办法先反转区间内的子链表再分别接上左边和右边。这样代码量更大而且左右两边的连接很容易出错。后来改成头插法代码短了一截逻辑也更稳定。调试过程中的体会是每执行一次循环用笔画一下链表的连接变化比看调试器的变量列表更快。4.3 常见边界条件的系统性核对清单链表题做多了你会发现绝大多数错误都集中在边界条件上。我自己总结了一个核对清单每写完一道链表题就对着清单检查一遍头节点为空的链表代码是否还能运行只有一个节点的链表代码是否还能运行删除或反转整个链表后返回值是否还能正确指向新头虚拟头节点的next是否已经接上了操作后的链表快慢指针中快指针的移动是否可能在fast.next.next处出现空指针递归解法中终止条件是否覆盖了head.next None的情况如果链表只有一个节点且需要删除它结果是否返回None比如环形链表II中找环入口时很多人容易在快慢指针移动后忘记检查fast None就访问fast.next导致空指针异常。这种错误在本地跑单个用例的时候不一定复现一旦遇到无环链表长度是奇数的情况就崩了。我在刷完整个专题之后养成了一个习惯把每道题目的边界条件专门写在注释里下次复习时直接看注释回忆而不需要重新从头纠结。比如反转链表II的注释里写的就是“left1时pre初始应指向dummy而不是head”。5. 常见问题与排查技巧实录从“能跑”到“跑对”的进阶之路5.1 高频报错与对应排查方案链表题的报错很有特征我在刷题过程中碰到过不少整理成一张速查表给大家参考报错现场可能原因解决方案空指针异常 / AttributeError访问了None.next或None.val检查while循环条件是否覆盖链表为空的情况检查快指针是否走到了null代码超时 / 死循环链表没有正确断开导致遍历永远走不到null检查需要断链的位置是否写了xxx.next None比如排序链表里找中点后一定要断开输出结果比预期多一个节点返回了dummy而不是dummy.next记住虚拟头节点是辅助节点真实头节点是它的next输出结果为空删除操作把整条链表删没了但没有正确返回None确认返回值是dummy.next且删除操作确实跳过了所有需要删除的节点只通过部分测试用例边界条件没有覆盖比如只有一个节点、left1、删除头节点对照我上面给的边界条件清单逐项检查堆比较错误优先队列中存在值相同的节点而节点本身不可比较存入值, 序号, 节点三元组用序号避免比较节点对象有一个比较隐蔽的报错是在合并K个链表中如果某个链表的头节点本身就是null但你仍然以“当前节点是否为null”作为取后继的条件可能会在某个时刻把null塞进堆里。解决方法是每次弹出节点后判断node.next ! None才入堆。这个小细节我当时漏了导致部分用例跑不过排查了十分钟才发现是null入堆的问题。5.2 排查思路善用断点调试和最小复现用例遇到链表题报错时我的排查流程基本是固定的。先说最小复现用例。你写一个测试输入一个只有两个节点的链表比如1-2执行算法观察结果是符合预期。如果这个简单用例都错了说明问题出在基础逻辑和复杂边界无关。然后用断点调试跟踪指针。我以删除倒数第N个节点为例假设链表是1-2-3-4-5n2。在代码里给slow.next slow.next.next这一行打断点运行到这一步时查看slow指向的节点值。如果slow指向的是3而不是4的前驱说明快指针先走的步数不对。这一步能直接定位到“fast走了n步还是n1步”这个问题。如果断点调试也找不出问题我还有个终极大法直接在纸上画出链表结构然后一行一行模拟代码执行。我的经验是链表题70%的错误都可以靠这个方法在十分钟内定位。不要觉得画图麻烦画一次顶debug半天。5.3 从简洁到健壮再到优雅的代码演进路径很多同学的链表代码能跑过测试用例但看起来不够“稳”。这里说的“稳”包括空指针是否有保护、边界情况是否显式处理、辅助函数是否抽得清晰。我拿合并K个有序链表举例最开始的版本把所有逻辑塞在一个while循环里堆里存的是值, 节点。它能跑但有几个隐患。后来我改成先定义辅助函数mergeTwoLists再用分治思路两两合并代码可读性好了很多调试也方便。再到后来我尝试堆解法用“值, 序号, 节点”存堆虽然代码长了点但逻辑分组清晰任何一段出问题都可以单独测试。代码演进的三层标准是这样的第一层“简洁”能写出短代码完成任务第二层“健壮”各种边界条件都考虑到了空指针不会崩第三层“优雅”有清晰的辅助函数变量命名有意义注释标明了关键操作的意图。我建议至少写到第二层再去面试第三层是在大量练习后自然形成的不用刻意追求。6. 复盘总结与面试应用视角链表专题刷完不是终点关键是能站在更高的视角复盘。热题100里链表题的天花板是排序链表和LRU缓存这两题分别代表了“已知算法在链表上的移植”和“数据结构组合设计”非常能拉开差距。刷到这两题时我最大的感受是前面那些基础题练的每一遍都没有白费。我个人刷完整个专题后形成了一套“五分钟快速解题框架”看到一道链表题先问三个问题——是否涉及节点删除或顺序调整如果是优先考虑虚拟头节点是否需要定位特定位置如果是思考双指针还是先遍历求长度是否涉及环或交点如果是直接想到快慢指针。这套框架在面试时能帮我在三十分钟内快速锁定解法方向而不是陷入“好像见过但又想不起来怎么做”的尴尬。如果后续想继续扩展还可以练一下链表的“在指定位置插入节点”、反转链表的递归版变体、奇偶链表分类调整等题目。这些题目在热题100里没有出现但它们的技巧都是从这个专题里衍生出来的。最后分享一个训练心得链表题适合“默写训练”。把每道题的模板代码背下来之后尝试不看任何参考在五分钟内从头到尾写一遍然后用测试用例验证。我连续默写三遍反转链表、合并有序链表、删除倒数第N个节点之后再去做综合题手感和以前完全不同。这种“肌肉记忆”在面试白板编程时尤其管用你会发现自己连边界条件都不用刻意去想手已经写对了。

相关新闻

【风电功率预测】【多变量输入单步预测】基于TCN-RVM的风电功率预测研究(Matlab代码实现)

【风电功率预测】【多变量输入单步预测】基于TCN-RVM的风电功率预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/14 4:13:48 阅读更多 →
HDR色调映射:对数变换原理、实现与调参优化

HDR色调映射:对数变换原理、实现与调参优化

/* 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 4:13:48 阅读更多 →
【无人机路径规划】基于粒子群优化和遗传算法的水陆两栖无人机任务规划和执行研究(Matlab代码实现)

【无人机路径规划】基于粒子群优化和遗传算法的水陆两栖无人机任务规划和执行研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…

2026/10/14 4:13:48 阅读更多 →

最新新闻

Cocos Creator 水波纹效果:Shader 扰动与交互涟漪实现

Cocos Creator 水波纹效果:Shader 扰动与交互涟漪实现

简介:这份资源是面向Cocos Creator开发者的一套水波纹特效项目源码,适合具备一定Shader与脚本基础、希望在游戏中实现动态水面、魔法或雨滴等视觉效果的开发者参考。压缩包共3个文件,以inscode工程配置、html页面与gitignore为主,…

2026/10/14 5:11:01 阅读更多 →
pyKT知识追踪复现框架:统一评测与训练流水线实践

pyKT知识追踪复现框架:统一评测与训练流水线实践

1. 从零散脚本到统一评测:为什么需要一套知识追踪复现框架做知识追踪方向的研究,最让人头疼的往往不是模型本身,而是复现环节。我见过太多这样的情况:论文里报告了一个漂亮的AUC,你兴冲冲地照着描述搭好网络结构&#…

2026/10/14 5:11:01 阅读更多 →
跌倒检测数据集zip文件实战:从解压到baseline的避坑指南

跌倒检测数据集zip文件实战:从解压到baseline的避坑指南

简介:跌倒检测数据集以zip压缩包形式提供,面向计算机视觉、模式识别与机器学习方向的研究者及算法开发者,用于训练和验证跌倒行为识别模型,尤其适合关注老年人健康监护与公共安全场景的智能系统研发。压缩包共收录2000个文件&…

2026/10/14 5:11:01 阅读更多 →
矩阵90度顺时针旋转的原地实现原理与工程实践

矩阵90度顺时针旋转的原地实现原理与工程实践

1. 项目概述:一道被低估的矩阵操作题,藏着工程思维的底层逻辑“牛客网-旋转矩阵/C翻转【简洁实现】”——光看标题,你可能以为这只是算法刷题平台里一道平平无奇的二维数组练习题。但在我带过的几十个模拟项目X训练营中,这道题是淘…

2026/10/14 5:11:01 阅读更多 →
AI芯片软硬件协同设计:从架构到调优的工程实践

AI芯片软硬件协同设计:从架构到调优的工程实践

1. AI芯片软硬件协同设计的核心逻辑1.1 为什么软硬件必须一起设计很多刚接触AI芯片的朋友会有一个误区,觉得芯片设计就是硬件工程师的事,软件团队等流片回来再适配就行。这个思路在传统通用CPU时代勉强能跑通,但在AI芯片领域基本等于自杀。我…

2026/10/14 5:11:01 阅读更多 →
Go语言流程控制详解:for循环、switch与defer的工程实践

Go语言流程控制详解:for循环、switch与defer的工程实践

如果你写过一段时间的 C 或者 Java,刚转 Go 时,流程控制这块第一感觉多半是:怎么这么少?没有 while,没有 do-while,switch 还自带 break,甚至 for 循环都能当 while 用。我一开始也挺不适应&…

2026/10/14 5:10:01 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →