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

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,它将从最后一个停止的元素继续。

Swe*_*per 6

然后我再次尝试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,将创建一个全新的迭代器。