class Node {
var value: Int
var nextNode: Node?
var prevNode: Node?
init(value: Int = 0, next: Node? = nil, prev: Node? = nil) {
self.value = value
self.nextNode = next
self.prevNode = prev
}
}
class LinkedList {
var size: Int = 0
var head: Node?
var tail: Node?
func insertBack(value: Int) {
let newNode = Node(value: value)
if head == nil {
head = newNode
tail = newNode
} else {
tail?.nextNode = newNode
newNode.prevNode = tail
tail = tail?.nextNode
}
size += 1
}
func insertAt(idx: Int, value: Int) {
let newNode = Node(value: value)
if idx == 0 {
newNode.nextNode = head
head?.prevNode = newNode
head = newNode
} else {
var current = head
for _ in 0..<(idx - 1) {
current = current?.nextNode
}
newNode.nextNode = current?.nextNode
current?.nextNode?.prevNode = newNode
current?.nextNode = newNode
newNode.prevNode = current
}
size += 1
}
func removeBack() {
tail = tail?.prevNode
tail?.nextNode = nil
size -= 1
}
func removeAt(idx: Int) {
if idx == 0 {
head = head?.nextNode
head?.prevNode = nil
} else {
var current = head
for _ in 0..<(idx - 1) {
current = current?.nextNode
}
current?.nextNode = current?.nextNode?.nextNode
current?.nextNode?.prevNode = current
}
size -= 1
}
func get(idx: Int) -> Int? {
var current = head
for _ in 0..<idx {
current = current?.nextNode
}
return current?.value
}
func set(idx: Int, value: Int) {
var current = head
for _ in 0..<idx {
current = current?.nextNode
}
current?.value = value
}
func printList() {
var current = head
while let node = current {
print(node.value, terminator: "")
current = node.nextNode
if current != nil {
print("->", terminator: "")
}
}
print()
}
}