题目描述:具体描述见原题。简单来说就是判断链表中是否有环。
解题思路:初始化两个指针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
}
补充说明:该题的解题思路其实可以作为常规技巧应用到很多场景,比如求链表的中间节点等。