【发布时间】:2021-05-23 23:11:01
【问题描述】:
我在 kotlin 中实现了一个 LinkedList,并编写了一个方法来从中删除重复项:
class Node (value:Int) {
var value = value
var next:Node? = null
fun addNodeToTail(value:Int){
var node = this
while (node.next != null) {
node = node.next
}
val newNode= Node(value)
node.next= newNode
}
fun removeDuplicates (){
val set = HashSet<Int>()
var node = this
set.add(node.value)
while(node.next != null){
if (set.contains(node.next?.value)){
node.next= node.next?.next
}else{
set.add(node.next.value)
node= node.next
}
}
}
}
在最后两行:
set.add(node.next.value)
node= node.next
(在 addNodeToTail 方法中),编译器说智能转换是不可能的,因为表达式很复杂。我必须添加非空断言调用 (!!)。
我想了解为什么不接受此解决方案,尽管 while 表达式检查 node.next 不为空。而且我想知道是否有比使用非空断言调用(!!)更好的解决方案。
感谢您的帮助
【问题讨论】:
-
这就是 Kotlin 空安全的工作原理。检查可变的
node.next != null并不意味着它以后不会为空,因为另一个线程可能访问该节点并修改next属性。您需要创建一个包含next.value的字段并引用它。
标签: kotlin linked-list