在 Swift 中判断链表是否有环可以使用快慢指针的方法。快指针每次走两步,慢指针每次走一步,若存在环,则它们最终会相遇。下面是一个基本的实现:
class ListNode {
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
}
}
func hasCycle(_ head: ListNode?) -> Bool {
var slow = head
var fast = head?.next
while fast != nil && fast?.next != nil {
if slow === fast {
return true
}
slow = slow?.next
fast = fast?.next?.next
}
return false
}
上述代码中,定义了一个 ListNode 类表示链表的每一个节点。hasCycle 方法用于判断给定的链表是否含有环,该方法重载了一个参数:链表的头节点。
在实现中,我们定义了两个指针 slow 和 fast 分别指向链表的头节点和第二个节点。然后,我们使用循环迭代链表,直到快指针到达链表的末尾或快指针和慢指针相遇为止。在循环迭代期间,快指针每次移动两个节点,而慢指针每次移动一个节点。如果存在环,则它们最终会相遇,并返回 true;否则返回 false。
需要注意的是,由于 Swift 是一门强类型语言,因此不能直接将两个对象进行比较。在上述代码中,我们使用了 === 运算符来判断两个指针是否指向同一个对象。