Doubly-linked list/Element insertion: Difference between revisions

Add swift
(Add swift)
Line 1,316:
}
}</lang>
 
=={{header|Swift}}==
 
<lang swift>typealias NodePtr<T> = UnsafeMutablePointer<Node<T>>
 
class Node<T> {
var value: T
fileprivate var prev: NodePtr<T>?
fileprivate var next: NodePtr<T>?
 
init(value: T, prev: NodePtr<T>? = nil, next: NodePtr<T>? = nil) {
self.value = value
self.prev = prev
self.next = next
}
}
 
@discardableResult
func insert<T>(_ val: T, after: Node<T>? = nil, list: NodePtr<T>? = nil) -> NodePtr<T> {
let node = NodePtr<T>.allocate(capacity: 1)
 
node.initialize(to: Node(value: val))
 
var n = list
 
while n != nil {
if n?.pointee !== after {
n = n?.pointee.next
 
continue
}
 
node.pointee.prev = n
node.pointee.next = n?.pointee.next
n?.pointee.next?.pointee.prev = node
n?.pointee.next = node
 
break
}
 
return node
}
 
// [1]
let list = insert(1)
 
// [1, 2]
insert(2, after: list.pointee, list: list)
 
// [1, 3, 2]
insert(3, after: list.pointee, list: list)</lang>
 
=={{header|Tcl}}==