❓6.6 Becoming a Swift Collection

没看懂,对索引下标的 < 运算符的定义,判断结点数组里是否包含右边参数结点是干什么?

static public func <(lhs: Index, rhs: Index) -> Bool {
    guard lhs != rhs else {
        return false
    }
    let nodes = sequence(first: lhs.node) { $0?.next }
    /// 什么意思
    return nodes.contains { $0 === rhs.node }
}

6.7 Value semantics and copy-on-write

值语义和写时拷贝是针对将一个实例对象赋值给另一个时,由于我们创建的 LinkedList 是一个结构体,属于值类型,赋值操作应该创建新的拷贝,然而 LikedList 内部包含 Node 属性,Node 却是一个类,是引用拷贝,这时就造成了值拷贝的失效。

解决方法:给每个对结点操作的方法,进行一次结点的拷贝赋值。

问题:每个对结点操作的方法的时间复杂度都会变为 O(n)

6.8 Optimizing COW

优化上述问题,使用 isKnownUniquelyReferenced(&head) 方法只在结点被多个地方引用的方法里进行拷贝。

但是当方法参数中传入 node 时,即使手动对结点进行过拷贝,仍然存在问题,因为传入的结点是旧链表中的结点,而新创建的链表不包含该结点,需要找到新链表中对应的结点再进行操作。