返回

LeetCode 141 环形链表:揭开代码迷宫,轻松判断链表有环无环

前端

环形链表,顾名思义,就是链表中的某个节点指向了链表中的某个前面节点,从而形成一个闭合的环路。判断链表是否存在环路对于理解链表的特性至关重要,在现实应用中也大有用处,例如检测内存泄露或无限循环。

LeetCode 141 题正是考察判断环形链表的能力。题目给出了一个链表的头部,让我们判断链表中是否存在环路。如果存在,返回环路起始节点的位置,否则返回 -1。

快慢指针法:高效且优雅的环形链表检测

解决环形链表问题的经典方法是快慢指针法。该方法巧妙地利用了链表的结构特征,以不同的速度遍历链表,如果链表中存在环路,则快指针和慢指针最终会相遇。

具体来说,我们使用两个指针:快指针每次前进两个节点,而慢指针每次前进一个节点。如果链表中存在环路,那么快指针最终会追上慢指针,并且两者会同时处于环路中。此时,我们计算快指针和慢指针之间的距离,这个距离就是环路的长度。再从链表头部出发,前进与环路长度相同的步数,即可找到环路起始节点。

Python 代码实现:清晰明了,步骤详实

def has_cycle(head):
    if not head or not head.next:
        return False

    slow = head
    fast = head.next

    while slow != fast:
        if not fast or not fast.next:
            return False

        slow = slow.next
        fast = fast.next.next

    # 计算环路长度
    cycle_length = 0
    while slow != fast:
        slow = slow.next
        cycle_length += 1

    # 从头部出发,前进环路长度步数
    slow = head
    fast = head
    for _ in range(cycle_length):
        fast = fast.next

    # 快指针和慢指针同时前进,直到相遇,相遇点即为环路起始节点
    while slow != fast:
        slow = slow.next
        fast = fast.next

    return slow

总结:深刻理解,灵活运用

环形链表的判断是算法和数据结构中的经典问题,掌握快慢指针法将极大地提升你的编程能力。通过对 LeetCode 141 题的深入解析,我们不仅学习了解决问题的方法,更重要的是领会了算法的精妙和效率。

在实际应用中,环形链表的检测经常用于调试程序和优化算法。通过识别和消除环形结构,我们可以避免内存泄露、死循环等问题,让代码运行更加高效稳定。