在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) } }
我认为问题在于这一行:
cur?.next = Node(n)
问题是如果cur
为null
,编译器不知道该怎么做。 目前,这会导致内部错误,但未来版本中可能会支持此功能。
现在,最好的解决方案是重写代码,以便编译器可以检查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) }