@@ -20,11 +20,7 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
2020 */
2121 operator fun get (index : Int ): T {
2222 if (index >= size || index < 0 ) throw IndexOutOfBoundsException ()
23- var node = lastNode!!
24- while (node.currentIndex != index) {
25- node = node.prev!!
26- }
27- return node.element
23+ return iterateNodesBackwards().first { it.currentIndex == index }.element
2824 }
2925
3026 fun isEmpty (): Boolean {
@@ -57,24 +53,12 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
5753 * calls on elements that aren't near the end.
5854 */
5955 fun toList (): List <T > {
60- val res = mutableListOf<T >()
61- var node = lastNode
62- while (node != null ) {
63- res.add(node.element)
64- node = node.prev
65- }
66- return res.reversed()
56+ return iterateBackwards().toList().reversed()
6757 }
6858
6959 /* * Converts the linked list into a set. */
7060 fun toSet (): Set <T > {
71- val res = mutableSetOf<T >()
72- var node = lastNode
73- while (node != null ) {
74- res.add(node.element)
75- node = node.prev
76- }
77- return res
61+ return iterateBackwards().toSet()
7862 }
7963
8064 /* * Returns the last element of the list */
@@ -102,18 +86,29 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
10286 * Iterate over the list backwards, returning the first seen element that fits the predicate.
10387 */
10488 fun findLast (predicate : (T ) -> Boolean ): T ? {
105- var node = lastNode
106- while (node != null ) {
107- if (predicate.invoke(node.element)) return node.element
108- node = node.prev
109- }
110- return null
89+ return iterateBackwards().firstOrNull(predicate)
11190 }
11291
11392 /* * Utility function for debugger views. */
11493 override fun toString (): String {
11594 return toList().toString()
11695 }
96+
97+ private fun iterateBackwards (): Sequence <T > {
98+ return iterateNodesBackwards().map { it.element }
99+ }
100+
101+ fun iterateIndexedBackwards (): Sequence <IndexedValue <T >> {
102+ return iterateNodesBackwards().map { IndexedValue (it.currentIndex, it.element) }
103+ }
104+
105+ private fun iterateNodesBackwards (): Sequence <Node <T >> = sequence {
106+ var node = lastNode
107+ while (node != null ) {
108+ yield (node)
109+ node = node.prev
110+ }
111+ }
117112}
118113
119114/* * Returns a new empty list */
0 commit comments