在Kotlin中实现链表

我最近开始学习Kotlin,所以我决定在其中实现一些数据结构。 所以,我试着实现一个单独的链表

package datastructures public class LinkedList { private data class Node(var nodeValue: Int, var next: Node? = null) private var head: Node? = null fun insert(n: Int) { if(head == null) head = Node(n) else { var cur = head while(cur?.next != null) { cur = cur?.next } cur?.next = Node(n) } } fun print() { var cur = head while(cur != null) { print("${cur.nodeValue} ") cur = cur?.next } } } fun main(args: Array<String>) { val n = LinkedList() n.insert(5) n.insert(3) n.print() } 

我得到了以下错误:

 Error:(22, 13) Kotlin: [Internal Error] org.jetbrains.jet.codegen.CompilationException: Back-end (JVM) Internal error: cannot store to value org.jetbrains.jet.codegen.StackValue$OnStack@a0a447f Cause: cannot store to value org.jetbrains.jet.codegen.StackValue$OnStack@a0a447f File being compiled and position: (22,13) in C:/Users/Khaled/IdeaProjects/Kotlin/src/LinkedList.kt PsiElement: cur?.next = Node(n) The root cause was thrown at: StackValue.java:75 at org.jetbrains.jet.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:243) at org.jetbrains.jet.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:262) at ... 

我一直在这里搜索和谷歌,但我不明白是什么原因导致这个错误

编辑:所以我试图重新实现insert功能,并使用requireNotNull()以避免让编译器担心空安全的东西。

这里是代码,它现在正在工作:

 fun insert(n: Int) { if (head == null) head = Node(n) else { var cur = head!! while (cur.next != null) { cur = cur.next!! } cur.next = Node(n) } } 

One Solution collect form web for “在Kotlin中实现链表”

我认为问题在于这一行:

 cur?.next = Node(n) 

问题是如果curnull ,编译器不知道该怎么做。 目前,这会导致内部错误,但未来版本中可能会支持此功能。

现在,最好的解决方案是重写代码,以便编译器可以检查cur是否为null 。 问题是编译器假定声明为var字段可以随时更改,所以它们的值需要在检查null之前被加载到本地变量中:

 var cur = head if(cur == null) head = Node(n) else { var next = cur.next while(next != null) { cur = next next = cur.next } cur.next = Node(n) } 
  • PubNub订阅android kotlin
  • 我可以比较Kotlin中两个浮点数是否相等吗?
  • java.lang.VerifyError在Kotlin中编写Android测试的特性
  • Kotlin的动态/双重调度有什么限制?
  • Kotlin:'exoPlayer'的类型与重写的var-property的类型不匹配public abstract var exoPlayer:ExoPlayer? 定义在
  • RxJava:在另一个异步生产中取消订阅异步观察
  • 构造函数使用可变参数在kotlin中调用
  • Kotlin:数据类的JsonProperty.Access.READ_ONLY
  • 在Kotlin中使用HTTP客户端时如何正确处理错误?
  • 在Kotlin中的正则表达式匹配
  • T.()的Kotlin函数签名是什么意思?
  • Kotlin language will be the best programming language for Android.