Swift中的循环链表

时间:2016-03-14 19:55:56

标签: swift linked-list

我想确定我的链表是否为空,但是,我不能通过检查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
    }
}

2 个答案:

答案 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
    }
}