如何在swift中比较两个通用链表?

时间:2017-08-13 18:56:30

标签: swift generics iequatable

我有一个通用链表,如果每个节点值相同且有序,我可以检查两个链表是否相等。 我有一个功能,它将链表分成两部分,后来我想检查两个列表在它的节点中是否有相同的值。

func divideList(atIndex index:Int) -> (first: LLGeneric<T>?,second: LLGeneric<T>?)

我查看了我的用例,我可以在分割后比较链接列表中的回文(在反转一个列表之后)。

注意:我的链接列表节点类似于

   class LLGenericNode<T> {
    var value: T
    var next: LLGenericNode?
    weak var previous: LLGenericNode?
    init(_ value: T) {
        self.value = value
    }
}

2 个答案:

答案 0 :(得分:2)

单线解决方案:定义一个通用T: Equatable应该足够了,确保在重载==运算符之后,您可以比较当前值和下一个节点。

请注意,使用lhs.next == rhs.next可以一口气介绍递归和空值:

class Node <T: Equatable>: Equatable {
    static func == (lhs: Node, rhs: Node) -> Bool {
        lhs.value == rhs.value && lhs.next == rhs.next
    }
}

答案 1 :(得分:1)

为了比较值,您必须要求TEquatable

class LLGenericNode<T: Equatable> {
    // ...
}

然后,您可以先通过比较值来实现==。 如果值相等,则递归地比较列表尾部。

extension LLGenericNode: Equatable {
    static func ==(lhs: LLGenericNode<T>, rhs: LLGenericNode<T>) -> Bool {
        if lhs.value != rhs.value {
            return false
        }
        switch (lhs.next, rhs.next) {
        case (nil, nil):
            // Both tails are == nil:
            return true
        case let (lvalue?, rvalue?):
            // Both tails are != nil:
            return lvalue == rvalue // Recursive call
        default:
            // One tails is nil and the other isn't:
            return false
        }
    }
}