Skip to content

Instantly share code, notes, and snippets.

@dbrockman
Created February 22, 2017 08:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dbrockman/ed7c31c62b8c097dca3e5e5920f9d525 to your computer and use it in GitHub Desktop.
Save dbrockman/ed7c31c62b8c097dca3e5e5920f9d525 to your computer and use it in GitHub Desktop.
public class Queue<T> {
public private(set) var size: Int = 0
private var head: QueueNode<T>? = nil
private var tail: QueueNode<T>? = nil
public func enqueue(_ value: T) {
let newTail = QueueNode(value: value)
if let oldTail = tail {
newTail.prev = oldTail
oldTail.next = newTail
} else {
head = newTail
}
tail = newTail
size += 1;
}
public func dequeue() -> T? {
guard let oldHead = head else { return nil }
let value = oldHead.value
if let newHead = oldHead.next {
newHead.prev = nil
head = newHead
} else {
head = nil
}
oldHead.next = nil
size -= 1
return value
}
public var peek: T? {
return head?.value
}
public var isEmpty: Bool {
return head == nil
}
public func clear() {
head = nil
tail = nil
size = 0
}
}
private class QueueNode<T> {
var value: T
var next: QueueNode<T>?
weak var prev: QueueNode<T>?
public init(value: T) {
self.value = value
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment