class Node { let value: T var next: Node? init(_ value: T, next: Node? = nil) { self.value = value self.next = next } } extension Node: CustomStringConvertible { var description: String { "\(value)" } } class LinkedList { var root: Node? var last: Node? init(root: Node? = nil) { self.root = root self.last = root } func insert(_ node: Node) { if root == nil { root = node last = node } else { last?.next = node last = node } } func delete(_ value: T) { let (previous, current) = _find(value) previous?.next = current?.next } private func _find(_ value: T) -> (previous: Node?, node: Node?) { var current: Node? = root var previous: Node? = nil while current != nil { if current?.value == value { break } previous = current current = current?.next } return (previous, current) } func find(_ value: T) -> Node? { _find(value).node } func reverse() { var current: Node? = root var previous: Node? = nil var next: Node? = nil while current != nil { next = current?.next current?.next = previous previous = current current = next } root = previous } } extension LinkedList: CustomStringConvertible { var description: String { guard let root else { return "" } var result = "" var current: Node? = root while current != nil { result += "\(current!.value) -> " current = current?.next } return result + "nil" } } let list = LinkedList() list.insert(Node(0)) list.insert(Node(1)) list.insert(Node(2)) list.insert(Node(3)) print(list) print(list.find(2) ?? Node(-1)) list.delete(2) print(list.find(2) ?? Node(-1)) print(list) list.reverse() print(list)