链表插入操作详解:指针顺序、虚拟头节点与三种场景实践
链表的插入操作听起来是数据结构里最入门的一课但我带新人和看简历项目代码的时候发现真正能一次写对的人其实不多。翻车点往往不在复杂的算法上而是栽在最不起眼的指针调整上——新节点的 next 应该先指向谁、前驱节点的 next 什么时候断开、空链表怎么处理、插到头部和插到中间有什么本质区别。这些细节如果没想透写出来的代码要么在某些边界条件下直接崩溃要么内存泄漏得毫无察觉。这篇东西我打算把链表插入操作这件事拆开揉碎讲清楚包括三种典型插入场景头插、中间插、尾插的完整步骤和代码实现以及我在实际调试中踩过的坑和总结的排查套路。适合刚学数据结构的学生、准备面试的开发者以及想回头看基础有没有漏洞的工程师。读完你不仅会写还能在别人写错的时候一眼看出问题。1. 插入操作的整体设计与思路拆解1.1 为什么是链表它和数组的插入逻辑完全不同先回到最底层的问题为什么会有链表这种东西因为数组在内存里是连续存储的往中间插一个元素后面的所有元素都得往后挪一位时间开销是 O(n)如果数组满了还得先扩容又是 O(n)。而链表靠的是指针把节点串起来节点在内存里可以东一个西一个互不相邻。插入一个新节点时理论上只需要改两条指针关系时间复杂度是 O(1)。但这里有个前提——你得先找到插入位置的前驱节点。找的过程如果要从头遍历那整体时间复杂度又变成 O(n) 了。所以链表的插入操作实际上要分两段看定位是 O(n)改指针是 O(1)。很多人面试被问“链表插入的时间复杂度是多少”脱口而出 O(1)其实是没把“定位”和“插入动作”区分开这就是概念不清的表现。抛开时间复杂度的讨论链表真正的价值在于存储空间可以动态分配、按需申请不会被初始大小困住节点删除和插入不需要搬移大量数据在频繁增删的场景下优势明显。实际项目中像是操作系统的进程队列、内存池的块管理、以及各种缓存策略比如 LRU 淘汰的底层结构都有链表的身影。1.2 三种插入场景头插、中间插、尾插到底有什么区别链表的插入按位置分无非三种插到最前面头插、插到中间某个位置按索引或者按值、插到最后面尾插。很多人觉得这三种方式都是“创建节点 调整指针”逻辑差不多但实际写的时候你会发现细节完全不一样。头插是最特殊的一种因为插入后链表的头指针 head 要变如果处理不好老的头节点就丢了整个链表就找不着了。中间插入最关键的是找到前驱节点而且索引的边界条件很容易出错插入位置是 0 还是 1 开始可不可以插到最后一个节点后面这些都得分清楚。尾插看起来最简单但如果链表没有单独记录尾节点还是要从头遍历到末尾复杂度就上去了如果只维护头指针每次尾插 O(n)如果加一个 tail 指针就能做到 O(1)代价是插入和删除时都要多维护一个指针。理解这三种场景的区别你会发现它们本质上是在回答一个问题新节点的前驱是谁后继是谁。只要这个想清楚了代码怎么写都有底气。1.3 前驱节点插入操作的核心枢纽无论哪种插入方式核心思想都是一个找到前驱节点 prev然后完成指针交接。所谓“前驱节点”就是新节点将要挂在它后面的那个节点。用排队来类比的话队伍里每个人都拉着前面那个人的衣角。现在新人要插到张三和李四中间张三就是前驱李四是后继。新人的手先拉住李四的衣角newNode-next prev-next然后张三的手再放开李四转过来拉住新人prev-next newNode。这个过程顺序不能乱如果先把张三的手放开李四就不知道跑哪去了后面的人全部失联——这就是丢链。理解了前驱节点你就理解了链表插入的一半。剩下的一半是边界条件怎么处理这个我们在下一节详细展开。2. 核心细节与指针操作要点两个容易翻车的环节2.1 节点结构与指针操作先想清楚 next 到底是什么先看最基本的节点定义。用 C 语言表示就是typedef struct Node { int data; // 数据域实际项目里可以换成任意类型 struct Node *next; // 指针域指向下一个节点 } Node;next是一个指针它存的是下一个节点的地址不是下一个节点的数据。这个概念看似简单但我见过不少初学着把p-next和p-next-data搞混或者在写p p-next的时候心里不清楚 p 现在到底指向哪一个节点。画图是理解指针操作最好的方式。你可以在草稿纸上画三个方框每个方框左边是数据、右边是指针箭头然后模拟插入过程。实际调试链表问题的时候我也建议先画图再写代码尤其是复杂的场景图能帮你把指针指向理清楚。2.2 两条赋值语句的顺序先连后断一步都不能反中间插入的核心代码就两行newNode-next prev-next; // 步骤1新节点先挂到后继上 prev-next newNode; // 步骤2前驱断开旧链接指向新节点这两行的顺序是链表面试中最经典的一个考点。如果反了先执行prev-next newNode那么原来prev-next指向的后继节点就“丢”了后面的所有节点都找不到了这就叫丢链。我用现实场景再解释一遍。假设有一串钥匙环环上已经串了 A、B、C 三把钥匙现在要把新钥匙 X 插到 B 和 C 中间。正常操作是先把 X 挂到 C 的钥匙环上相当于X-next C再把 B 和 C 之间的环扣解开、让 B 挂到 X 上相当于B-next X。如果你先解开了 B 和 C 的环扣C 和后面的钥匙就全散了你还得先找回 C 才能继续挂 X——如果 C 掉地上滚走了就彻底完蛋。这是非常生动也很容易理解的比喻。在真实代码里丢链后整个链表就断了但是程序往往不会立刻崩溃因为prev-next原来的值还留在内存里只是在逻辑上再也无法从链表头访问到了。这就是比崩溃更可怕的问题——数据静默丢失。2.3 虚拟头节点头插法和中间插入如何统一头插和中间插入的代码最大的区别在于头插需要更新头指针head而中间插入不需要。这导致了一个很讨厌的问题同样的插入逻辑在头部和中间要写两遍而且头部的边界很容易出错。解决办法是用虚拟头节点dummy head / sentinel node。思路是在真正的链表头前面额外创建一个不存储有效数据的节点让它的 next 指向真正的第一个节点。Node *dummy (Node *)malloc(sizeof(Node)); // 虚拟头data 不存储有效数据 dummy-next head;这样不管插入位置在哪里都找到了统一的前驱节点模型插入到位置 0前驱就是 dummy插入到位置 k前驱就是遍历找到的那个节点。头指针更新也统一了因为不管怎么插真正的头节点都是dummy-next而 dummy 本身永远不变。虚拟头节点还有一个好处链表为空的时候head NULL的情况可以一并处理。没有虚拟头空链表插入头节点需要特殊判断有了虚拟头空链表的插入和普通插入没有任何区别。这个技巧在我实际写代码时几乎是必用的让我省掉了大量特判。2.4 内存分配与释放配对谁申请谁负责插入操作一定会创建新节点而 C 语言里创建节点就是malloc。这里有个硬规则每个 malloc 都必须对应一个 free内存的申请和释放要配对出现。很多人写的链表代码能跑但一用内存检测工具就报泄漏原因就是只 malloc 不 free。链表在插入时 malloc在删除节点时就应该 free如果链表装完数据直接丢弃头指针后面一整串节点的内存都不会被释放。在嵌入式环境里泄漏一次可能没什么感觉但循环操作几万次后可用内存会越来越少最后程序直接卡死。写代码的时候我有个习惯每写一个新节点的 malloc立刻想清楚这个节点在什么路径下会被释放。想不清楚就先不写想清楚了再动手。这是从业多年养成的习惯也是我辅导新人时反复强调的一点。3. 实操从零实现三种插入方式3.1 前置准备链表的基础框架先搭一个最简的框架包含创建节点和打印链表两个基础函数。打印链表用来验证插入结果是调试时的必备工具。#include stdio.h #include stdlib.h typedef struct Node { int data; struct Node *next; } Node; // 创建新节点 Node* createNode(int data) { Node *newNode (Node *)malloc(sizeof(Node)); if (newNode NULL) { printf(内存分配失败\n); exit(1); } newNode-data data; newNode-next NULL; return newNode; } // 打印链表 void printList(Node *head) { Node *cur head; while (cur ! NULL) { printf(%d - , cur-data); cur cur-next; } printf(NULL\n); }这里有两个关键点。第一createNode返回前一定要把next初始化为 NULL否则这个指针就是一个野指针指向一块不确定的内存后面用到它的地方全是隐患。第二malloc 之后马上判断是否成功虽然考试和教材里常省略这个判断但实际项目的健壮性要求是必须检查的。生产环境的 malloc 失败虽然少见但一旦发生不检查就是空指针解引用崩溃。3.2 头插法代码最简短但最容易出错头插法就是在当前链表的头部插入新节点。核心是新节点的 next 指向原来 head然后更新 head。void insertAtHead(Node **head, int data) { Node *newNode createNode(data); newNode-next *head; // 先让新节点指向原来的头 *head newNode; // 再更新头指针 }这里必须用二级指针Node **head因为要修改调用方的 head 变量本身。如果只传一级指针Node *head你在函数里改的是 head 的副本调用方的 head 根本不会变。有的语言比如 Python里没有指针的概念但思路是一样的头插法需要同时更新引用并返回新节点或者在类的方法里通过 self 更新内部属性。理解了“修改对象本身还是修改对象的引用”这个道理语言差异只是语法形式不同。测试代码int main() { Node *head NULL; insertAtHead(head, 3); insertAtHead(head, 2); insertAtHead(head, 1); printList(head); // 输出1 - 2 - 3 - NULL return 0; }有个地方我要专门提醒如果忘记了newNode-next *head这一步而只执行*head newNode那么新节点会自己指向 NULL原来的链表就丢了。很多人调试这个问题半天以为是内存地址不对其实就是漏了一行赋值。3.3 按索引插入前驱查找与边界校验按索引插入需要实现先判断索引合法性再遍历找到第 index-1 个节点即前驱最后执行标准的指针交接。索引从 0 开始也就是插入到位置 0 表示成为新的头节点。void insertAtIndex(Node **head, int index, int data) { Node *dummy createNode(0); // 虚拟头节点 dummy-next *head; Node *prev dummy; // 移动 prev 到索引 index 的前一个节点 for (int i 0; i index; i) { if (prev-next NULL) { printf(索引越界无法插入\n); free(dummy); return; } prev prev-next; } Node *newNode createNode(data); newNode-next prev-next; prev-next newNode; *head dummy-next; // 不管有没有插到头部都通过 dummy 更新 head free(dummy); }注意我用 dummy 的写法让头部插入和中间插入的逻辑统一了。如果没有 dummy代码会分裂成两段index 0时走头插逻辑index 0时走中间插入逻辑。两段逻辑不仅冗余而且 index 为负、index 恰好等于链表长度时都要小心特判。用 dummy 后index 0就是prev停在 dummy 不动然后执行同样的插入操作逻辑统一且几乎不会漏边界。索引校验的逻辑也要解释一下for循环在prev-next NULL时退出说明已经到链表末尾了。如果此时还没走到目标位置说明 index 超出了链表真实长度直接报错返回。例如链表有 2 个节点尝试 insertAtIndex(head, 5, data)循环到第三次时 prev-next 已经是 NULL于是报越界。3.4 尾插法要不要维护 tail 指针尾插法比较简单。如果没有尾指针先遍历到最后一个节点再插入void insertAtTail(Node **head, int data) { Node *newNode createNode(data); if (*head NULL) { *head newNode; return; } Node *cur *head; while (cur-next ! NULL) { cur cur-next; } cur-next newNode; }空链表时直接让 head 指向新节点这是必须有的边界判断。如果不判断while循环用cur-next时会解引用空指针直接崩溃。如果链表同时维护了head和tail两个指针尾插就变成了 O(1)void insertAtTailOptimized(Node **tail, int data) { Node *newNode createNode(data); (*tail)-next newNode; *tail newNode; }但维护尾指针的代价是头插、中间插入、删除节点时都需要同步维护 tail否则 tail 可能指向被删除的节点或者在新节点插入中间时 tail 还是老节点。在实际项目中你需要在查询速度和代码复杂度之间做取舍。如果业务有频繁的删除和中间插入维护 tail 的维护成本可能高于收益如果是简单的队列场景tail 指针省下的 O(n) 遍历非常明显。3.5 用 Python 复现一遍高级语言如何封装这些逻辑用 Python 写链表逻辑和 C 完全一致但代码更简洁class Node: def __init__(self, data): self.data data self.next None class LinkedList: def __init__(self): self.head None def insert_at_head(self, data): new_node Node(data) new_node.next self.head self.head new_node def insert_at_index(self, index, data): dummy Node(0) dummy.next self.head prev dummy for _ in range(index): if prev.next is None: print(索引越界无法插入) return prev prev.next new_node Node(data) new_node.next prev.next prev.next new_node self.head dummy.next def insert_at_tail(self, data): new_node Node(data) if self.head is None: self.head new_node return cur self.head while cur.next is not None: cur cur.next cur.next new_node def print_list(self): cur self.head while cur: print(cur.data, end - ) cur cur.next print(None)Python 版本的代码和 C 版本几乎一一对应没有指针语法之后初学者往往反而更容易理解“前驱节点”这个概念。很多用 Python 刷题的人没写过 C 语言遇到链表题很容易因为语法不熟而卡住我的建议是先用 Python 理清逻辑再回头用 C 写一遍看指针两种语言交替学底子会打得非常牢固。4. 常见问题与排查技巧实录4.1 空链表插入NULL 指针的解引用陷阱空链表是最典型的边界条件head NULL。在这个状态下头插没有任何问题直接把 head 指向新节点就行。尾插必须判断head NULL否则cur-next就是空指针解引用。按索引插入时index 0可以用 dummy 统一处理index 大于等于 1 直接判越界。这里我建议的办法是写代码前先列一个检查清单把“链表为空、只到一个节点、目标是头节点、目标是尾节点、索引越界”这五种情况全部跑一遍。很多人写链表代码的 bug一律来自这些边界条件没覆盖全。4.2 丢链问题一条赋值语句引发的蝴蝶效应丢链是链表面试里最常见的问题场景也有几种插入时只做了prev-next newNode忘了先把newNode-next指向后继节点导致从新节点之后整体断裂。头插时newNode-next没有指向原来 head导致原链表丢失。删除时直接 free 了当前节点但是当前节点的 next 没有保存后面节点全部断掉。排查丢链问题有一个很实用的技巧在插入或删除前后分别调用 printList 打印链表对比哪个地方断了。如果你用的是测试用例而不是真实的百万级数据打印链表永远是第一排查手段。4.3 循环链表与双向链表的插入差异线性链表写顺手后很多人会直接去写循环链表或双向链表结果踩了更大的坑。循环链表的尾节点 next 指向头节点而不是 NULL。所以插入时判断“是否到链尾”的条件从cur-next NULL变成了cur-next head。循环链表的头插和尾插几乎一模一样因为头部和尾部天然相邻只需要注意别让遍历陷入死循环。双向链表多了一个 prev前驱指针插入时需要操作四条指针比单向链表翻了一倍。但好处也很明显给定某个节点可以 O(1) 地在它前面插入而不需要从头遍历找前驱。实际项目里如果涉及频繁的逆序遍历双向链表比单向链表方便得多。但代价是每个节点要多存一个指针的空间而且在插入删除时要处理的指针数量翻倍代码出错概率也跟着上升。4.4 常见问题速查表问题现象可能原因排查与修复插入后链表变短前驱节点的 next 被覆盖旧后继丢失检查是否先执行newNode-next prev-next再执行prev-next newNode程序直接崩溃空链表下访问cur-next插入前判断 head 是否为 NULL插入位置不对索引没有处理好确认索引是 0 开始还是 1 开始用 dummy 统一处理内存泄漏malloc 后忘记 free或丢弃头指针每个 malloc 必须配对 free用 valgrind 检查泄漏程序偶尔崩溃野指针或未初始化的 next 指针createNode 中初始化 next 为 NULL头插后原链表不可访问只更新了 head没有让新节点先指向原 head调整赋值顺序先接后续断4.5 调试技巧printf 不是万能但没它绝对不行链表调试我习惯分层处理。第一层是 printList确认结构没断第二层是局部打印插入前打印前驱节点的地址和值、后继节点的地址和值第三层才是内存工具比如 Valgrind 检测泄漏。使用 Valgrind 的命令很简单valgrind --leak-checkfull ./your_program它会输出哪里 malloc 了、对应 free 没有。如果报告 memory leak逐行检查链表路径上所有影响控制流的条件分支尤其注意提前 return 的分支。还有一个测试技巧值得多说一句用随机数生成大量数据做压力测试。比如循环 1 万次随机插入、随机删除然后检查链表长度是否符合预期。很多隐蔽的问题比如索引越界、内存泄漏在手工测试几个数据时根本不会暴露压力测试一跑就现原形。我自己在实际中总结的经验是链表的插入操作80% 的问题出在“没画图就动手写代码”。画图五分钟能省下调试两小时。不管是单向链表、双向链表还是循环链表先在纸上把节点的前进后退过程画明白再落到代码上基本就不会出大错。如果你后续想在这个基础上深入建议尝试实现双向链表、循环链表、以及基于链表的 LRU 缓存。搞懂了链表插入这些扩展都不难而且能帮你彻底把链表的各种变体吃透。希望你写的代码一次通过测试。

相关新闻

新项目只有代号?这份DAY1实战流程帮你从零推上正轨

新项目只有代号?这份DAY1实战流程帮你从零推上正轨

我接到的任务只有一个代号:【TJXT】DAY1。没有需求文档,没有会议纪要,甚至连这个项目到底要做什么都只存在于某次聊天记录的一句话里。很多开发者应该都遇到过这种开局——领导丢过来一个缩写,邮件里写着"新项目启动&#xf…

2026/10/17 12:58:11 阅读更多 →
AgentScope 实战:基于 A2A 协议实现跨框架 Agent 互联

AgentScope 实战:基于 A2A 协议实现跨框架 Agent 互联

A2A 协议在 AgentScope 里跑通之后,我最大的感受是:跨框架的 Agent 互联终于不是只能靠“自己写适配器”硬凑了。这个标题乍看是一个协议实战,实际上覆盖了 Agent Card、任务生命周期、消息路由、异构生态集成整条链路,比单纯调一…

2026/10/17 12:58:11 阅读更多 →
负载均衡SLB核心知识详解:从四层七层选型到健康检查与调度算法

负载均衡SLB核心知识详解:从四层七层选型到健康检查与调度算法

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

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

最新新闻

GEE极端降水指数计算全流程:从CHIRPS数据到R95p趋势分析

GEE极端降水指数计算全流程:从CHIRPS数据到R95p趋势分析

简介:这份资源是一套基于Google Earth Engine(GEE)与NASA GPM IMERG V07数据的极端降水分析代码包,服务于遥感、水文与灾害风险研究场景,也适合有一定GEE基础、希望直接复用降水分析脚本的开发者。代码完整覆盖从研究区…

2026/10/17 20:59:06 阅读更多 →
基于随机森林的贷款审批MATLAB实现与决策树分类系统解析

基于随机森林的贷款审批MATLAB实现与决策树分类系统解析

简介:一份面向机器学习初学者的随机森林模式识别系统设计与实现项目文档,以银行贷款审批为应用场景,解决依据年龄、收入、住房、信用、性别、居住地等七个特征判断是否同意贷款的识别问题。文档系统阐述随机森林算法思想——通过有放回抽样构…

2026/10/17 20:59:06 阅读更多 →
MCP服务创建指南:用TaoToken统一Key打通本地工具链

MCP服务创建指南:用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/17 20:59:06 阅读更多 →
UltraEdit 语法高亮配置文件怎么写:从零定制一门语言的高亮规则

UltraEdit 语法高亮配置文件怎么写:从零定制一门语言的高亮规则

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

2026/10/17 20:59:06 阅读更多 →
OpenResearch统一配置指南:Claude Code、Codex、OpenCode与Cursor多工具协同

OpenResearch统一配置指南:Claude Code、Codex、OpenCode与Cursor多工具协同

1. 从“OpenResearch”说起:一个被低估的开发者工具入口第一次看到“OpenResearch”这个词,很多人会下意识以为它是个学术论文检索平台,或者某个开源社区的研究板块。但如果你最近在开发者圈子里混,尤其是关注 Claude Code、Codex…

2026/10/17 20:59:06 阅读更多 →
两台华硕 Ascent GX10 跑本地 Coding Agent,效果怎么样?

两台华硕 Ascent GX10 跑本地 Coding Agent,效果怎么样?

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

2026/10/17 20:58:05 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →