leetcode-141

91 阅读1分钟

题目描述:具体描述见原题。简单来说就是判断链表中是否有环。

解题思路:初始化两个指针s,f。s每次向前移动一个节点,f每次向前移动两个节点,如果链表中存在环路,那么在若干次循环后一定会出现s与f指向同一个节点的情况。就好比两个人跑圈,跑的快的人一定会在跑道上某个位置和跑得慢的人相遇(不幸的套圈事件发生了,突然觉得如果和老马跑3000米,我肯定能套他两圈)。

具体代码:

func hasCycle(head *ListNode) bool {
    s, f := head, head
    for f != nil && f.Next != nil {
        s = s.Next 
        f = f.Next.Next
        if s == f {
            return true
        }
    }
    return false
}

补充说明:该题的解题思路其实可以作为常规技巧应用到很多场景,比如求链表的中间节点等。