题目
// 给你一个链表的头节点 head ,判断链表中是否有环。
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init(_ val: Int) {
* self.val = val
* self.next = nil
* }
* }
*/
解答
func hasCycle(_ head: ListNode?) -> Bool {
var slow = head, fast = head
repeat {
slow = slow?.next
fast = fast?.next?.next
} while slow !== fast && fast != nil
return fast == nil ? false : true
}
分析
- 核心方法:快慢指针;
- Swift没有 do while, 需要使用 repeat while 代替;
- 不可使用 slow != fast,因为 ListNode 没有实现 Equalable 协议;
思考
如果链表有环,为什么一定会出现 slow === fast ? fast 不可以跨越 slow 么?