Rem*_*tta 1 linked-list data-structures singly-linked-list kotlin
我正在 Kotlin 中实现 LinkedList。我想实现Iterator接口,以便我可以像这样为 LinkedList 上的每个元素实现linkedlist.forEach{}。
这是我的代码
class SinglyLinkedList<T> : Iterator<T> {
var head: SinglyLinkedListNode<T>? = null
private set(value) {
cursor = value
field = value
}
var count = 0
private set
// This is needed for iterator functionality.
private var cursor: SinglyLinkedListNode<T>? = null
override fun hasNext(): Boolean {
// the problem is when I return in the middle of the loop
// then start new for each
// cursor is not equal head
return if (cursor == null){
// if this is the last time, reset cursor so that next time we start from the begining
cursor = head
false
} else {
true
}
}
override fun next(): T {
val temp = cursor
cursor = cursor!!.next
return temp!!.value
}
}
Run Code Online (Sandbox Code Playgroud)
当我做这样的事情时就会出现问题
linkedlist.forEach{
if(it) == 1 return
}
Run Code Online (Sandbox Code Playgroud)
然后我再次尝试forEach,它将从最后一个停止的元素继续。
然后我再次尝试
forEach,它将从最后一个停止的元素继续。
是的,这就是 anIterator应该做的。AnIterator是一个有状态的东西——它知道它当前“位于”哪个元素。你想让你的链表知道它当前“位于”哪个元素吗?你可能不知道,是吗?您希望链接列表和该链接列表的迭代器是不同的东西。
该列表可以是可迭代的,这意味着您可以iterator从列表中获取一个。
class SinglyLinkedList<T> : Iterable<T> {
var head: SinglyLinkedListNode<T>? = null
private set
var count = 0
private set
override fun iterator() = object: Iterator<T> {
private var cursor: SinglyLinkedListNode<T>? = head
override fun hasNext() = cursor != null
override fun next() = (cursor?.value ?: throw NoSuchElementException()).also {
cursor = cursor?.next
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在forEach在列表上执行操作将创建列表的迭代器,并且在迭代列表之后(无论迭代到哪个元素),迭代器都将被丢弃。下次调用时forEach,将创建一个全新的迭代器。
| 归档时间: |
|
| 查看次数: |
1020 次 |
| 最近记录: |