-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathlinkdlist
120 lines (120 loc) · 2.97 KB
/
linkdlist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
class Node<T>(value: T){
var value:T = value
var next: Node<T>? = null
var previous:Node<T>? = null
}
class LinkedList<T> {
private var head:Node<T>? = null
var isEmpty:Boolean = head == null
fun first():Node<T>? = head
fun last(): Node<T>? {
var node = head
if (node != null){
while (node?.next != null) {
node = node?.next
}
return node
} else {
return null
}
}
fun count():Int {
var node = head
if (node != null){
var counter = 1
while (node?.next != null){
node = node?.next
counter += 1
}
return counter
} else {
return 0
}
}
fun nodeAtIndex(index: Int) : Node<T>? {
if (index >= 0) {
var node = head
var i = index
while (node != null) {
if (i == 0) return node
i -= 1
node = node.next
}
}
return null
}
fun append(value: T) {
var newNode = Node(value)
var lastNode = this.last()
if (lastNode != null) {
newNode.previous = lastNode
lastNode.next = newNode
} else {
head = newNode
}
}
fun removeAll() {
head = null
}
fun removeNode(node: Node<T>):T {
val prev = node.previous
val next = node.next
if (prev != null) {
prev.next = next
} else {
head = next
}
next?.previous = prev
node.previous = null
node.next = null
return node.value
}
fun removeLast() : T? {
val last = this.last()
if (last != null) {
return removeNode(last)
} else {
return null
}
}
fun removeAtIndex(index: Int):T? {
val node = nodeAtIndex(index)
if (node != null) {
return removeNode(node)
} else {
return null
}
}
override fun toString(): String {
var s = "["
var node = head
while (node != null) {
s += "${node.value}"
node = node.next
if (node != null) { s += ", " }
}
return s + "]"
}
}
fun main(args: Array<String>) {
var ll = LinkedList<String>()
ll.append("John")
println(ll)
ll.append("Carl")
println(ll)
ll.append("Zack")
println(ll)
ll.append("Tim")
println(ll)
ll.append("Steve")
println(ll)
ll.append("Peter")
println(ll)
print("\n\n")
println("first item: ${ll.first()?.value}")
println("last item: ${ll.last()?.value}")
println("second item: ${ll.first()?.next?.value}")
println("penultimate item: ${ll.last()?.previous?.value}")
println("\n4th item: ${ll.nodeAtIndex(3)?.value}")
println("\nthe list has ${ll.count()} items")
}