如何使用 Kotlin 为 LinkedList 实现迭代器

How to implement iterator for a LinkedList using Kotlin

我正在 Kotlin 中实现 LinkedList。我想实现 Iterator 接口,这样我就可以像这样 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
    }
}

当我这样做时会出现问题

linkedlist.forEach{
 if(it) == 1 return
}

然后我再次尝试 forEach,它将从它停止的最后一个元素继续。

then I try to forEach again, it will continue from the last element it stopped at.

是的,这就是 Iterator 应该做的。 Iterator 是一个有状态的东西——它知道它当前在哪个元素上。你想让你的链表知道它当前“在”哪个元素吗?你可能不知道,是吗?您希望您的链表和该链表的 迭代器 是不同的东西。

列表可以是iterable,意思是可以从列表中得到一个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
        }
    }
}

现在在列表上做forEach会创建一个列表的迭代器,在遍历列表后(无论迭代到哪个元素),迭代器将被丢弃。下次调用 forEach 时,会创建一个全新的迭代器。