Swift 中的循环链表



我想确定我的链表是否为空,但是,我不能通过检查head.next==tail来做到这一点,因为我会收到一个错误,二进制运算符"=="不能应用于类型为"LLNode?"的操作。

import Foundation
class LLNode<T> {
    var key: T!
    var next: LLNode?
    var previous: LLNode?  
}
public class LinkedList<T: Equatable> {
    private var head: LLNode<T> = LLNode<T>()
    private var tail: LLNode<T> = LLNode<T>()
    init() {
        head.next = tail
        head.previous = tail
        tail.next = head
        tail.previous = head
    }
    func isEmpty() {
        return head.next == tail ? true : false
    }
}

在这种情况下,您可能应该使用 === 运算符检查headtail是否是同一实例。请注意,这与在 Swift 中测试相等性不同。

==检查对象相等性,您必须自己定义对象相等性,而===确定两个变量是否引用同一实例。因此,您的支票应如下所示:

func isEmpty() -> Bool {
    return head.next === tail
}

三元运算符不是必需的,因为比较运算符已经返回了一个布尔值。

您可以使LLNode符合Equatable协议,但这意味着您还必须对所有LLNode约束T: Equatable

如果我对您的代码进行最小的更改以使其正常工作,我会这样做:

func isEmpty() -> Bool {
    if let next = head.next where next.key == tail.key {
        return true
    } else {
        return false
    }
}

相关内容

  • 没有找到相关文章

最新更新