Doubly-linked list/Element insertion: Difference between revisions
Content added Content deleted
(Add swift) |
|||
Line 1,316: | Line 1,316: | ||
} |
} |
||
}</lang> |
}</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}}== |
=={{header|Tcl}}== |