You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以最简方式查找Linked List中间节点?附相关代码

查找链表中间节点的最简实现方法

嘿,我来分享一下查找链表中间节点最简洁高效的实现思路——快慢指针法,这是目前公认的最优解,时间复杂度O(n),空间复杂度O(1),完全不需要额外统计链表长度或者用栈之类的辅助结构。

方法原理

核心逻辑特别直观:

  • 初始化两个指针,slow(慢指针)和fast(快指针),都从链表的head节点出发
  • 慢指针每次走1步,快指针每次走2步
  • 当快指针走到链表末尾(fast为None或者fast.nextNode为None)时,慢指针刚好指向链表的中间节点
    • 如果链表节点数是奇数,慢指针就是正中间的节点
    • 如果是偶数,慢指针会停在中间两个节点里靠左的那个(想靠右的话微调循环条件即可)

结合你的代码实现

在你的LinkedList类里添加如下方法就能直接用:

class Node:
    def __init__(self, data, nextNode=None):
        self.data = data
        self.nextNode = nextNode
    def getData(self):
        return self.data
    def setData(self, val):
        self.data = val
    def getNextNode(self):
        return self.nextNode
    def setNextNode(self, val):
        self.nextNode = val

class LinkedList:
    def __init__(self, head=None):
        self.head = head
        self.size = 0
    def getSize(self):
        return self.size  # 补全你未写完的部分
    
    # 新增:查找中间节点的方法
    def getMiddleNode(self):
        # 处理空链表的边界情况
        if not self.head:
            return None
        
        slow = self.head
        fast = self.head
        
        # 循环条件:快指针还能继续走两步
        while fast and fast.getNextNode():
            slow = slow.getNextNode()
            fast = fast.getNextNode().getNextNode()
        
        return slow

小测试示例

比如你构建链表:1 -> 2 -> 3 -> 4 -> 5,调用getMiddleNode()会返回值为3的节点;如果是1 -> 2 -> 3 -> 4,会返回值为2的节点(要是想返回3,只需要把循环条件改成while fast.getNextNode() and fast.getNextNode().getNextNode()就行)。

这个方法之所以简洁,是因为它只需要一次遍历就能定位中间节点,不用先统计长度再走半程,代码少还高效。

内容的提问来源于stack exchange,提问作者Sedat Özdemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:20:40