Python链表实现指南:从内存模型到单双循环链表详解
1. 项目概述链表是计算机科学中一位绕不开的老朋友。作为数据结构课程里最先接触的线性存储结构之一链表和数组一起构成了绝大多数复杂算法与系统设计的基石。我见过不少初学者在学完数组之后直接跳到链表结果在指针和节点引用之间绕得晕头转向也见过工作几年的人回头重新梳理链表发现自己在反转、合并这类基础操作上依然不够顺手。这篇内容围绕链表的核心概念、内存模型、常见操作以及对应的Python代码实现展开尽量把每一步的为什么也讲清楚而不只是贴一段能跑通的代码。这篇文章适合几类读者刚学数据结构、被指针和引用折腾得够呛的初学者准备面试、需要快速复习链表面试题型的求职者以及工作中需要手写底层结构、或者想理解Python对象引用本质的开发者。读完你可以获得一套完整的链表知识框架同时拿到一份可以直接复制的Python实现代码涵盖单链表、双链表和循环链表。链表在Python里有个特殊性——我们不需要像C/C那样手动管理指针但对象引用本身就是一个隐式指针理解这一点之后很多奇怪的行为就解释得通了。1.1 核心需求解析从标题拆解来看需求其实有两层第一层是知识第二层是实现。知识层面要解决链表是什么、为什么需要它、它的优缺点边界在哪里实现层面则要求代码能跑、能改、能复用。这两层缺一不可——只讲理论不写代码读者看完依然不知道怎么动手只贴代码不讲原理换个场景就不知道怎么变通。因此本文将两条线并行推进每介绍一个概念马上配套Python实现并解释代码背后的设计选择。2. 链表的底层逻辑为什么需要它2.1 从数组说起连续内存的痛点要理解链表的价值最好先回顾数组在内存中的存储方式。数组是一段连续的内存空间每个元素紧挨着排布地址连续。这种布局带来两个显著优点随机访问极快通过下标计算偏移量就能定位元素缓存友好因为数据在空间上连续CPU在加载第一个元素时会把附近的数据一并读入高速缓存。但连续内存的代价同样明显。插入和删除需要移动大量元素来维持连续性。假设一个长度为10万的数组在头部插入一个元素后面所有元素都要向后挪一格最坏情况的时间复杂度是O(n)。另一个问题是内存分配必须一次性申请足够大的连续空间如果不知道最终数据量要么预先分配过多浪费内存要么中途扩容导致元素整体搬迁——Python列表的内存扩容策略已经优化得很好了但底层依然逃不开这个模式。链表选择了一条完全不同的路不要求物理连续每个节点自己占据一小块内存节点之间通过指向下一个节点的引用串起来。就像一列火车每节车厢不需要紧贴着前一节只要挂钩锁住就行。这样插入或删除一个节点只需要调整相邻节点的挂钩不需要动其他节点时间复杂度降为O(1)。2.2 链表节点的内存模型链表的基本单元是节点。每个节点由数据域和指针域组成数据域存放真实数据指针域存放相邻节点的地址。在C语言里这个指针是实实在在的内存地址在Python里则体现为对象引用。class Node: def __init__(self, data): self.data data self.next None这段代码创建了一个节点类实例化时传入数据默认next指向None。理解Python对象引用是关键self.next None并不是把某个内存地址清零而是把引用置空。当执行a.next b时实际上是把a的next引用指向b这个对象所在的内存区域。这和C语言中的指针有细微差别但抽象层面几乎可以画等号。一旦想通了这一点链表在Python中实现起来其实比C语言更清爽因为不需要考虑指针类型、内存释放等问题垃圾回收机制会帮我们处理不再被引用的节点。2.3 单链表、双链表、循环链表三种变体怎么选链表的三种基本形态各有取舍。单链表结构最简单每个节点只保存next引用遍历只能从头到尾单向进行。优点是每个节点占用的额外空间最小只多一个引用字段缺点是无法反向遍历而且删除某个节点时必须知道它的前驱节点。很多链表面试题的基础操作比如反转、找中间节点都基于单链表展开。双链表在节点里额外保存prev引用。这个改动看起来只有一行字段但带来质的变化双向遍历变成可能删除任意节点不再需要从头找前驱直接操作当前节点即可。代价是每个节点多占一个引用的内存同时插入、删除时更新指针的操作步骤变多写起来更容易出错。Python内置的collections.deque底层就是双链表结构支撑它高效地在两端做增删。循环链表把末尾节点的next指向头节点形成一个环。它最适合解决需要无限循环遍历的场景比如操作系统的进程调度、约瑟夫问题、存储池管理等。循环链表可以与单链表或双链表组合形成单向循环链表或双向循环链表。需要注意的是如果遍历循环链表没有终止条件程序会陷入死循环所以通常要引入一个哨兵节点或计数条件。实际的业务选型中如果数据以追加-遍历为主单链表达如果需要在中间频繁删除插入双链表更顺手如果需要轮询每个元素循环链表配合哨兵节点是经典方案。3. Python链表实现从零到能用的完整代码3.1 准备工作定义节点类与基础方法在动手写链表类之前需要先确定我们要支持哪些操作。训练阶段我建议至少包含以下方法is_empty()判断链表是否为空len()返回链表长度travel()遍历链表打印所有节点数据add_head(data)头部插入append(data)尾部插入insert(index, data)指定位置插入remove(data)删除第一个匹配的节点search(data)查找节点是否存在这一套方法覆盖了链表最核心的增删查改把这些写明白之后扩展其他方法也只是复制粘贴级别的功夫。下面从单链表开始逐步分析。3.2 单链表的完整实现class SingleLinkedList: def __init__(self): self._head None self._length 0 def is_empty(self): return self._head is None def __len__(self): return self._length def travel(self): cur self._head while cur is not None: print(cur.data, end ) cur cur.next print() def add_head(self, data): node Node(data) node.next self._head self._head node self._length 1 def append(self, data): node Node(data) if self.is_empty(): self._head node else: cur self._head while cur.next is not None: cur cur.next cur.next node self._length 1 def insert(self, index, data): if index 0: self.add_head(data) elif index self._length: self.append(data) else: node Node(data) cur self._head pos 0 while pos index - 1: cur cur.next pos 1 node.next cur.next cur.next node self._length 1 def remove(self, data): cur self._head prev None while cur is not None: if cur.data data: if prev is None: self._head cur.next else: prev.next cur.next self._length - 1 return True prev cur cur cur.next return False def search(self, data): cur self._head while cur is not None: if cur.data data: return True cur cur.next return False这段代码里有几个细节值得展开说明。add_head的逻辑是新节点先指向旧头节点再更新头节点指向。很多人初学时会把这两步顺序写反写成先更新self._head再让node.next指向self._head结果新节点自己指向自己链表断裂。这里的关键原则是先建立新节点的next指旧头再移动头指针。顺序反了就会弄丢整个链表。remove方法中我们同时维护cur和prev两个引用这对应了前面提到的单链表删除节点需要知道前驱的特性。当prev is None时说明删除的是头节点直接移动头指针即可否则prev.next cur.next完成逻辑上的断链。Python的垃圾回收器会发现cur节点已经没有引用指向它自动回收内存这一步在C语言里对应free(cur)。3.3 双链表的实现与细节对比双链表的核心区别在于节点有prev引用因此删除操作不需要再单独维护pre变量。不过插入和删除时需要同时改动四个引用更考验对指针操作的熟练度。class DNode: def __init__(self, data): self.data data self.prev None self.next None class DoubleLinkedList: def __init__(self): self._head None self._length 0 def is_empty(self): return self._head is None def __len__(self): return self._length def travel(self): cur self._head while cur is not None: print(cur.data, end ) cur cur.next print() def add_head(self, data): node DNode(data) if self.is_empty(): self._head node else: node.next self._head self._head.prev node self._head node self._length 1 def append(self, data): node DNode(data) if self.is_empty(): self._head node else: cur self._head while cur.next is not None: cur cur.next cur.next node node.prev cur self._length 1 def remove(self, data): cur self._head while cur is not None: if cur.data data: if cur.prev is None: self._head cur.next else: cur.prev.next cur.next if cur.next is not None: cur.next.prev cur.prev self._length - 1 return True cur cur.next return False双链表删除节点时必须同时处理两个方向让前驱的next绕过当前节点让后继的prev绕过当前节点。我见过不少人在删除最后一个节点时忘记检查cur.next is not None直接执行cur.next.prev cur.prev结果因为cur.next是None而抛出空引用异常。所以上面代码里专门加了那行判断——这是双链表实现中最高频的错误来源。对比来看双链表与单链表的主要差异集中在空间开销、删除效率、代码复杂度这三个维度特性单链表双链表额外空间占用每个节点1个引用每个节点2个引用删除当前节点需顺序查找前驱直接改两个方向的引用反向遍历不支持支持代码实现难度较低较高需小心空引用3.4 循环链表的实现与遍历防死循环循环链表有两种常见形式单循环链表和双循环链表。下面以单循环链表为例。class CircularLinkedList: def __init__(self): self._head None self._length 0 def is_empty(self): return self._head is None def __len__(self): return self._length def travel(self): if self.is_empty(): return cur self._head while True: print(cur.data, end ) cur cur.next if cur is self._head: break print() def add_head(self, data): node Node(data) if self.is_empty(): node.next node self._head node else: cur self._head while cur.next is not self._head: cur cur.next node.next self._head cur.next node self._head node self._length 1 def append(self, data): node Node(data) if self.is_empty(): node.next node self._head node else: cur self._head while cur.next is not self._head: cur cur.next cur.next node node.next self._head self._length 1 def remove(self, data): if self.is_empty(): return False cur self._head prev None while True: if cur.data data: if prev is None: # 处理可能只有一个节点的情形 if cur.next is self._head: self._head None else: last self._head while last.next is not self._head: last last.next last.next self._head.next self._head self._head.next else: prev.next cur.next self._length - 1 return True prev cur cur cur.next if cur is self._head: break return False循环链表一个非常容易踩的坑是travel方法的终止条件。如果不做特殊处理while cur.next is not None这种单链表的遍历条件会导致无限循环因为最后一个节点的next指向头节点而不是None。解决办法有两种要么在循环内部判断当前节点是否回到了头节点要么在初始化时引入一个固定的哨兵节点遍历时以是否再次碰到哨兵作为结束标志。上面的实现采用前一种方案因为不额外占用节点理解起来也更直观。删除最后一个节点也就是链表中只有一个节点时需要特别小心。此时cur.next指向自己直接置空self._head就好不要尝试更新next引用。如果链表有多个节点删除头节点时还要先找到尾节点因为它指向头节点删除后要让尾节点指向新的头节点否则链表内部的循环会断裂。这种边缘条件在面试中经常作为追问出现。4. 核心操作背后的思维逻辑为什么这样写4.1 插入操作的指针顺序陷阱插入操作本质上是先建立新节点的前后指向再断开原有链接。以单链表在中间位置插入为例如果顺序写反就会断链。假设当前链表是A - B - C要在A和B之间插入X。正确顺序是X.next BA.next X。这样执行完后A - X - B - C链条完好。如果先执行A.next X再执行X.next B此时A.next已经变成了X原来的B节点被临时断开联系X.next B需要用一个额外变量提前把B存下来才能完成。这个例子的深层教训是任何链表指针操作都应该先考虑我怎么不丢失对后续节点的访问。先接上新节点再断开旧链接是最安全的操作顺序。这个原则在双链表和循环链表中同样适用。双链表插入时需要先设置新节点的prev和next再修改前后节点的引用最后才更新指针。任何一步顺序错了轻则丢失某些节点重则形成环导致死循环。4.2 删除操作如何避免丢失节点删除操作的目的是让某个节点从链表中脱离本质上是绕过后继指针。单链表中删除节点B需要让A.next CB节点就没有引用指向它了Python的垃圾回收会自动清理。但前提是删除前必须找到A即前驱节点这需要我们维护一个prev变量。这里有一个实用技巧有时候面试题会要求在不给前驱节点的情况下删除已知节点这种问题通常用伪删除来解决——把B节点的data复制为C节点的data然后让B.next C.next。数据层面B已经被替换成C的内容物理层面B依然存在但已经变了身份。这是一种典型的换皮技巧在LeetCode上出现过好几道变形题。4.3 遍历链表的要点游标与终止条件遍历链表时通常用一个游标变量cur从头节点出发沿着next引用移动直到链尾。单链表和双链表的终止条件都是cur is None循环链表则是再次遇到头节点。遍历中一个常见的性能陷阱是频繁调用len()而不维护计数器。因为链表不支持随机访问每次求长度都必须从头走到尾时间复杂度O(n)。我在实现里专门维护了self._length这个属性插入或删除时同步更新。这样做会把len()的时间复杂度降为O(1)代价是代码里只要修改链表结构的地方都必须记得更新计数器漏一处就会造成长度不准确。实际项目中我建议写入单元测试删除节点后立即断言长度变更正确这个习惯能救回不少隐性bug。5. 常见问题与排查技巧实录5.1 为什么我反转链表时总丢节点链表反转是面试中出现频率最高的题目之一。很多人在写迭代版本时一路反转指针指向结果发现中间节点找不到了。核心原因是对临时变量的使用不够谨慎。def reverse_list(head): prev None cur head while cur is not None: next_node cur.next # 先保存下一个节点防止丢失 cur.next prev # 反转当前节点的指向 prev cur # prev前移 cur next_node # cur前移 return prev # 新链表头三行核心代码的先后顺序务必固定先保存next_node再修改cur.next最后移动prev和cur。我在教学中发现最容易写错的就是漏掉next_node cur.next这一行回头代码跑起来直接抛空引用异常或死循环。如果调试中觉得指针绕不清可以用纸笔画一遍链表三行代码三种状态画完基本就通了。5.2 快慢指针找中间节点什么时候用怎么用链表的长度无法直接知道找中间节点不能先遍历求长度再走一半当然那样也可以只是不够优雅。经典解法是用两个指针快指针每次走两步慢指针每次走一步快指针到末尾时慢指针恰好指向中间节点。def find_middle(head): slow head fast head while fast is not None and fast.next is not None: slow slow.next fast fast.next.next return slow终止条件需要注意如果链表长度为偶数快指针最后一次移动时fast.next可能是None此时fast.next.next会抛异常所以循环条件里要先判fast.next is not None。另外慢指针最终停在哪个节点取决于偶数长度时的定义有的题目要求返回两个中位数中的第一个有的要求返回第二个需要根据需求调整初始位置或步长。这个概念在检测链表是否有环时也会复用区别在于快指针绕环跑慢指针必然在环内相遇。5.3 链表的环如何检测和定位入口检测链表是否有环最简单的办法就是快慢指针慢指针每次走一步快指针每次走两步如果链表存在环快指针最终会在环内追上慢指针。判断出有环之后再找入口节点有一个非常巧妙的数学结论从起点和相遇点各出发一个指针每次各走一步它们最终会在环的入口相遇。def detect_cycle(head): slow head fast head while fast and fast.next: slow slow.next fast fast.next.next if slow is fast: break if not fast or not fast.next: return None ptr1 head ptr2 slow while ptr1 is not ptr2: ptr1 ptr1.next ptr2 ptr2.next return ptr1快慢指针能相遇的原因可以用数学证明设链表头到环入口的距离为a环入口到相遇点的距离为b环的周长为c。当快慢指针第一次相遇时慢指针走了ab步快指针走了ab n*c步n为快指针多绕的圈数。因为快指针速度是慢指针的两倍可以列方程解得a n*c - b。也就是说从相遇点继续走n*c - b步就到环入口而从头节点走到环入口正好是a步。第二个循环相当于用两个相同速度的指针验证这个等式的几何意义。实际中我不会在面试时去背这个推导过程但理解了这个逻辑代码写起来就顺理成章。5.4 哨兵节点让边界条件不再需要if判断链表中对头节点的处理往往要单独写分支代码里有大量如果是头部则特殊处理的逻辑。哨兵节点可以简化这一切——在链表真正头部前放一个虚拟节点它不存数据只作为标记存在。比如把单链表节点的定义改为class LinkedListWithSentinel: def __init__(self): self.sentinel Node(None) self.sentinel.next None有了哨兵节点后插入和删除的代码不需要对头节点做特殊判断因为头节点永远不会被误删prev也永远不会为空。这在复杂度上多了一层引用的引用写起来却清爽很多。LeetCode很多官方题解都用了哨兵节点比如合并两个有序链表、删除链表的倒数第N个节点等。一个实用建议是如果某个链表的题目需要对头节点做特判先想想能不能改用哨兵节点。5.5 Python特有的几个坑可变对象、深拷贝、循环引用Python链表有几个语言特有的问题需要留意。第一个是节点数据如果是可变对象比如列表或字典修改该对象的内容会直接影响链表中存储的值因为节点存的是引用而不是副本。这既是特性也是风险需要根据业务决定是否深拷贝。第二个是循环引用的内存回收。循环链表中节点之间形成环彼此引用不再被外部引用时Python的引用计数无法归零。好在Python的垃圾回收器会定期检测循环引用一般不会内存泄漏但大量短生命周期循环链表的创建还是可能带来GC压力。如果追求极致性能可以考虑在删除节点时显式断开相关引用或者用weakref减少强引用链。第三个是深拷贝问题。Python自带的copy.deepcopy可以递归复制链表但如果链表里有环必须确保深拷贝逻辑正确处理循环引用否则会陷入无限递归。自定义深拷贝时可以维护一个原节点到新节点的映射字典遇到已拷贝过的节点直接返回映射对象。这类问题在实际使用Queue、Graph等结构时也会遇到本质上都在考察对引用语义的理解。6. 链表的应用场景与扩展思路数据结构不能脱离场景谈价值。链表在真实系统中几乎无处不在只是很多框架把它们藏在了底层。操作系统中的内存池、空闲块链表、消息队列内核实现LRU缓存淘汰算法经典的LeetCode 146题底层是哈希表加双向链表solr、Redis等中间件内部也有链表结构的影子。很多高效算法比如约瑟夫环问题、多项式运算、大数加法用链表表达都很自然。在工作实践中链表最典型的应用就是LRU缓存。哈希表负责O(1)查找双向链表负责O(1)删除和移动节点。每次访问一个key找到对应节点把它从链表中摘除并移动到队首缓存满时删除队尾节点并同步清除哈希表中的记录。如果你已经掌握双链表的核心操作实现LRU缓存不过是在此基础上加一层哈希映射。from collections import OrderedDict class LRUCache: def __init__(self, capacity): self.capacity capacity self.cache OrderedDict() def get(self, key): if key not in self.cache: return -1 self.cache.move_to_end(key) return self.cache[key] def put(self, key, value): if key in self.cache: self.cache[key] value self.cache.move_to_end(key) else: self.cache[key] value if len(self.cache) self.capacity: self.cache.popitem(lastFalse)Python的OrderedDict底层就是双向链表加哈希表的经典组合move_to_end操作对应链表节点的删除与尾部插入popitem(lastFalse)对应删除链表头部的元素。这段代码本身也展示了如何基于一个成熟数据结构快速实现业务逻辑但如果你想真正理解内部原理依然绕不开手写链表。扩展到更复杂的数据结构链表的思路还延伸到了跳表。跳表在普通链表之上增加了多级索引通过随机化的层数实现O(log n)的查找、插入和删除。Redis的有序集合底层就是跳表实现。理解了链表的基本指针操作再去看跳表的多级指针调整会顺畅很多。7. 实操心得与避坑指南集合写链表代码这么多年我总结出几条对任何人都适用的经验供参考。第一先画图再写码。链表的所有操作本质上都是指针重连图比文字直观得多。遇到一个解不开的指针问题在纸上画三条链、标清楚每一步的前驱后继十次里有九次能立刻发现问题。调试时用IDE的调试器观察每一步的next引用比打印日志高效得多。第二统一命名规范。链表中常用的变量名尽量固定下来cur代表当前节点prev代表前驱next_node代表后继临时保存。混乱的命名是链表代码出bug的催化剂一个教程里如果一会儿用p一会儿用q读者自己就绕进去了。第三强烈建议在测试中覆盖空链表、单节点、双节点、多节点这四种边界情况。很多链表的bug都出在只有两个节点这样的临界场景比如反转链表只有一个节点时返回结果是否仍是它自己。写单元测试后这种问题会暴露得非常快。第四对链表性能有心理预期。O(1)插入删除只发生在已经知道插入/删除位置的前提下单纯的查找依然是O(n)的线性扫描。实际业务中如果频繁需要按下标访问元素链表并不合适数组或平衡二叉树可能是更好的选择。选错数据结构通常比实现细节错误代价更大。第五面试中如果遇到链表题不要急着动手写代码。先和面试官确认清楚是单链表还是双链表是否允许修改节点值是否需要保持原有相对顺序。这些细节决定了后续算法的复杂度和实现方式问清楚反而显得思路严谨。回想我自己最初学习链表时最大的障碍其实是指针恐惧。总担心一个不小心就把链表弄丢了后来借助画图和大量手写练习彻底克服了。链表的操作模式非常固定无非是改引用、防丢失、注意边界这三件事多练几遍熟得就像条件反射。希望这份从原理到代码的梳理能帮你少走一些弯路。

相关新闻

PG用户做OLAP不必换库:DuckDB与Trino的轻量级方案

PG用户做OLAP不必换库:DuckDB与Trino的轻量级方案

PG用户做OLAP,别总想着换库先说个我经常遇到的场景:业务库是PostgreSQL,跑了几年,数据量到了几百GB甚至几个TB的量级,日常的增删改查一点问题没有,但一到月底出报表、跑聚合、算留存,查询时间直…

2026/10/11 12:31:26 阅读更多 →
CefSharp多账号同时在线:RequestContext隔离与浏览器指纹修改实战

CefSharp多账号同时在线:RequestContext隔离与浏览器指纹修改实战

简介:这份资源面向使用 C# 进行 Web 自动化与多账号管理的开发者,基于 CEFSharp 封装 Chromium 浏览器引擎,重点解决多账号同时登录、Cookie 隔离与浏览器指纹修改三大问题。包内通过为每个账号创建独立 ChromiumWebBrowser 实例并绑定独立 I…

2026/10/11 12:31:26 阅读更多 →
高比例可再生能源电力系统调峰成本量化与分摊模型Matlab实现

高比例可再生能源电力系统调峰成本量化与分摊模型Matlab实现

“高比例可再生能源电力系统”“调峰成本量化”“分摊模型”,这三个词放在一起的时候,很多做电力系统优化的朋友心里应该已经有画面了:风电光伏占比一高,净负荷曲线变成“鸭子”,火电机组一天到晚启停、深调、爬坡&…

2026/10/11 12:31:26 阅读更多 →

最新新闻

中文域名是否值得企业注册?

中文域名是否值得企业注册?

随着数字经济不断发展,域名早已不只是互联网访问地址,更是企业品牌形象、数字身份和市场传播体系的重要组成部分。 然而,在讨论“企业是否有必要注册中文域名”时,部分观点仍然沿用传统英文域名时代的判断标准,认为企…

2026/10/11 13:28:59 阅读更多 →
从Reactor到百万连接:Linux服务端高并发实战指南

从Reactor到百万连接:Linux服务端高并发实战指南

如果你最近两三年才开始写Linux服务端,大概率看到过那张非常经典的图:一个叫 Reactor 的框把 accept、read、write 这些事件当作对象轮转分发,旁边标注着“百万级并发”。图看懂了,代码也抄了,用 epoll 写了一个 echo …

2026/10/11 13:28:59 阅读更多 →
2核4G云服务器部署开源AI模型:从Ollama到Open WebUI完整指南

2核4G云服务器部署开源AI模型:从Ollama到Open WebUI完整指南

想养一只AI“龙虾”?蓝队云2核4G10M带宽的配置就够了!听到这个标题是不是有点懵?“龙虾”哪来的?其实是我朋友最近折腾AI时冒出来的说法。他在一台2核4G的云服务器上部署了一个开源大模型,用来做个人问答服务&#xff…

2026/10/11 13:28:59 阅读更多 →
OpenCV手势识别毕设源码复现指南:环境搭建、肤色分割与凸缺陷数手指避坑

OpenCV手势识别毕设源码复现指南:环境搭建、肤色分割与凸缺陷数手指避坑

简介:这份资源是面向计算机相关专业学生与项目实战学习者的Python毕业设计参考项目,主题为基于OpenCV的手势识别系统,适合正在准备大作业、毕业设计或需要中等难度实战案例的人群。项目经导师指导并获评审98分认可,源码均经本地编…

2026/10/11 13:28:59 阅读更多 →
SS728M05神思标准化接口Windows部署与调用实战指南

SS728M05神思标准化接口Windows部署与调用实战指南

简介:面向Windows平台的身份证验证场景,神思标准化接口SS728M05 V2.0.0.5提供了一套可直接集成的SDK开发包,适合需要在银行开户、网络实名认证、公共服务等业务中快速接入身份证读取与核验功能的开发者使用。压缩包共29个文件,整体…

2026/10/11 13:28:59 阅读更多 →
OpenPose 1.7.0 模型文件版本对齐与预处理规范

OpenPose 1.7.0 模型文件版本对齐与预处理规范

简介:本资源为OpenPose 1.7.0版本所需的全部官方模型文件集合,面向计算机视觉开发者、AI算法工程师及姿态识别方向的研究者,解决关键点检测模型缺失导致无法本地部署与推理的核心问题。压缩包共15个文件,包含6个Caffe网络结构定义…

2026/10/11 13:27:58 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →