【问题标题】:Implementing Linked List in Kotlin在 Kotlin 中实现链表
【发布时间】:2014-11-15 23:06:48
【问题描述】:

我最近开始学习 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)
    }
}

【问题讨论】:

  • 你使用什么版本的 Kotlin?
  • @abacabadabacaba 0.8.11
  • 注意:内部编译器错误是由于 Kotlin 的一个非常旧的 pre-beta 版本造成的。

标签: linked-list kotlin


【解决方案1】:

我认为问题出在这一行:

cur?.next = Node(n)

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

目前,最好的解决方案是重写代码,以便编译器可以检查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)
}

【讨论】:

  • 在 Kotlin 中,您可以使用 !! 运算符:a!! 而不是 requireNotNull(a)
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多