// 1
extension LinkedList: CustomStringConvertible {
// 2
public var description: String {
// 3
var text = "["
var node: Node? = head
// 4
while node != nil {
text += "\(node!.value)"
node = node!.next
if node != nil { text += ", " }
}
// 5
return text + "]"
}
}
class Node {
var value: Int
var next: Node?
init(_ value: Int) {
self.value = value
self.next = nil
}
}
class LinkedList {
var head: Node
var tail: Node
var length: Int
init(_ value: Int) {
self.head = Node(value)
self.head.next = nil
self.tail = self.head
self.length = 1
}
func append(_ value: Int) {
self.tail.next = Node(value)
self.tail = self.tail.next!
self.length += 1
}
func prepend(_ value: Int) {
var temp = self.head
self.head = Node(value)
self.head.next = temp
self.length += 1
}
func remove(index: Int) {
if index >= self.length {
//return something
} else if (index == 0) {
self.head = self.head.next!
self.length -= 1
} else {
var preNode = getNodeAtIndex(index-1)
var node = preNode.next!
if let postNode = node.next {
preNode.next = postNode
} else {
print("hEY")
preNode.next = nil
self.tail = preNode
}
self.length -= 1
}
}
func insert(_ value: Int, index: Int) {
var node = self.head
if index >= self.length {
//return something
} else if (index == 0) {
self.prepend(value);
} else {
var preNode = getNodeAtIndex(index-1)
var postNode = preNode.next
var newNode = Node(value)
preNode.next = newNode
newNode.next = postNode
self.length += 1
}
}
func getNodeAtIndex(_ index: Int) -> Node {
var node = self.head
for i in 0..<index {
if node != nil {
node = node.next!
//print(node.value)
} else {
break;
}
}
return node
}
}
var myLinkedList = LinkedList(10)
myLinkedList.append(5)
myLinkedList.append(16)
myLinkedList.prepend(1)
myLinkedList.insert(2, index: 0)
myLinkedList.remove(index: 4)
print(myLinkedList.tail.value)
print(myLinkedList)
print(myLinkedList.length)