我想确定我的链表是否为空,但是,我不能通过检查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
}
}
答案 0 :(得分:3)
在这种情况下,您应该使用head
运算符检查tail
和===
是否是同一个实例。请注意,这与在Swift中测试相等性不同。
==
检查对象是否相等,您必须自己定义,而===
确定两个变量是否引用同一个实例。因此,您的支票应如下所示:
func isEmpty() -> Bool {
return head.next === tail
}
三元运算符不是必需的,因为比较运算符已经返回Bool。
答案 1 :(得分:0)
您可以LLNode
符合Equatable
协议,但这意味着您必须对所有T: Equatable
约束LLNode
。
如果我对您的代码进行微小的更改以使其有效,请按照以下方式进行:
func isEmpty() -> Bool {
if let next = head.next where next.key == tail.key {
return true
} else {
return false
}
}