import Foundation
public class Node<T> {
var value: T
var next: Node<T>?
weak var previous: Node<T>?
init(value: T) {
self.value = value
}
}
public class LinkedList<T> {
private var head: Node<T>?
private var tail: Node<T>?
public var isEmpty: Bool {
return head == nil
}
public var first: Node<T>? {
return head
}
public var last: Node<T>? {
return tail
}
public func append(value: T) {
let newNode = Node(value: value)
if let tailNode = tail {
newNode.previous = tailNode
tailNode.next = newNode
} else {
head = newNode
}
tail = newNode
}
public func nodeAt(index: Int) -> Node<T>? {
if index >= 0 {
var node = head
var i = index
while node != nil {
if i == 0 { return node }
i -= 1
node = node!.next
}
}
return nil
}
public func removeAll() {
head = nil
tail = nil
}
public func remove(node: Node<T>) -> T {
let prev = node.previous
let next = node.next
if let prev = prev {
prev.next = next
} else {
head = next
}
next?.previous = prev
if next == nil {
tail = prev
}
node.previous = nil
node.next = nil
return node.value
}
}
extension LinkedList: CustomStringConvertible {
public var description: String {
var text = "["
var node = head
while node != nil {
text += "\(node!.value)"
node = node!.next
if node != nil { text += ", " }
}
return text + "]"
}
}
'아이폰 (IOS)' 카테고리의 다른 글
| [Swift 3.0] Background Mode 이해하기 (1) | 2016.12.01 |
|---|---|
| [Swift 3.0] Queue (0) | 2016.11.24 |
| [Swift 3 ] 가장 쉬운 소켓 (TCP) 통신 방법을 찾고 계신가요? (2) | 2016.11.24 |
| iOS 개발에서 스토리보드 란 무엇인가? (0) | 2016.11.22 |
| iOS 와 안드로이드에서의 병렬 쓰레드 개발 (AsyncTask 와 GCD) (0) | 2016.11.21 |