In Linked Lists, why don't we have to write code to conform to Sequence?

I’m making slow progress because I like to explore all ramifications of what I’m learning. Have been concentrating on Section II only and doing a lot of work on Linked Lists. It really bothered me that Nodes (an implementation detail of Linked Lists) are exposed to the user. There is no need to package Elements inside Nodes for other Collections. In particular, why would the user want to insert(after:) or remove(after:) nodes rather than after values. I implemented insert(before value:) and removeFirst(_ value:) instead.
I decided to embed the Nodes inside the LinkedList and subscript on Int and it works smoothly.

This made me spend some time looking at Sequence and Collection and I realised I barely understand them. Can anyone explain why we don’t have to write code to conform to Sequence? I assume our Collection code helps out but I don’t see how it figures out our data structure.

I eventually came up with the following but my project doesn’t need it though it does call it when not commented out. Why do I not need this code?

extension LinkedList: Sequence {
    public func makeIterator() -> Iterator {
        return Iterator(node: head)
    }

    public struct Iterator: IteratorProtocol {
        private var currentNode: Node<Value>?

        fileprivate init(node: Node< Value >?) {
            currentNode = node
        }

        public mutating func next() -> Value? {
             guard let node = currentNode else {
                return nil
            }
            currentNode = node.next
            return node.value
        }
    }
}

As for the challenges, since we are a collection, what is wrong with?

// challenge 1
for l in list.reversed() { print(l) }

My indexes are Ints and Collection gives us count so I can write:

// challenge 2
print(list[list.count / 2])

Then my API provides removeFirst(_ value:) → Bool instead of remove(_ node:) and so:

// challenge 5
value = 7
var found = false
repeat {
    found = list5.removeFirst(value)
} while found
print(list)

A further benefit of this approach is that I have no need for the second COW function. My code works without it.