没看懂,对索引下标的 <
运算符的定义,判断结点数组里是否包含右边参数结点是干什么?
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 }
}
值语义和写时拷贝是针对将一个实例对象赋值给另一个时,由于我们创建的 LinkedList
是一个结构体,属于值类型,赋值操作应该创建新的拷贝,然而 LikedList
内部包含 Node
属性,Node
却是一个类,是引用拷贝,这时就造成了值拷贝的失效。
解决方法:给每个对结点操作的方法,进行一次结点的拷贝赋值。
问题:每个对结点操作的方法的时间复杂度都会变为 O(n)
。
优化上述问题,使用 isKnownUniquelyReferenced(&head)
方法只在结点被多个地方引用的方法里进行拷贝。
但是当方法参数中传入 node
时,即使手动对结点进行过拷贝,仍然存在问题,因为传入的结点是旧链表中的结点,而新创建的链表不包含该结点,需要找到新链表中对应的结点再进行操作。