如何在Kotlin单链表中实现查找满足谓词的最后一个节点?
开发任务
- 编写名为lastWhere的方法,接受类型为(T) -> Boolean的where函数作为入参,返回最后一个符合where判断规则的T类型元素,无匹配元素时返回null。
- 在给定的链表上调用lastWhere方法,查找价格低于10欧元的最后一个游戏。
实现方案
核心修改点说明
- 原有
lastWhere方法仅返回链表尾节点,未做条件匹配:修改为遍历全链表时缓存所有符合条件的元素,遍历结束后返回最后一次缓存的符合条件的元素即可。 - main函数中的调用规则原有判断为价格>=10,调整为价格<10即可匹配需求。
完整可运行代码
class LinkedList<T> { data class Node<T>(val data: T, var next: Node<T>?) private var first: Node<T>? = null override fun toString(): String = first?.toString() ?: "-" fun isEmpty() = first == null fun addLast(data: T) { if (first == null) { first = Node(data, first) return } var runPointer = first while (runPointer?.next != null) { runPointer = runPointer.next } runPointer?.next = Node(data, null) } fun lastWhere (where: (T) -> Boolean): T? { if (isEmpty()) return null // 存储最后一个匹配的元素 var matchedResult: T? = null var runPointer = first // 遍历所有节点 while (runPointer != null) { // 符合条件就更新缓存的结果 if (where(runPointer.data)) { matchedResult = runPointer.data } runPointer = runPointer.next } return matchedResult } } data class Game(val title: String, val price: Double) fun main() { val list = LinkedList<Game>() list.addLast(Game("Minecraft", 9.99)) list.addLast(Game("Overwatch", 29.99)) list.addLast(Game("Mario Kart", 59.99)) list.addLast(Game("World of Warcraft", 19.99)) // 修改判断条件为价格低于10欧元 val result = list.lastWhere { it.price < 10.00 } println(result) }
运行输出
Game(title=Minecraft, price=9.99)
内容的提问来源于stack exchange,提问作者Kise948
相关产品推荐
相关产品推荐

