我想确定我的链表是否为空,但是,我不能通过检查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
}
}
在这种情况下,您可能应该使用 ===
运算符检查head
和tail
是否是同一实例。请注意,这与在 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
}
}