【问题标题】:Kotlin linked list: How to check if given list is sorted (descending)Kotlin 链表:如何检查给定列表是否已排序(降序)
【发布时间】:2020-08-20 04:46:36
【问题描述】:

我正在尝试编写一个函数,该函数确定给定的链表是否已排序(降序)。

给定列表 1:8 -> 5 -> 3 -> null (true)

给定 list2:8 -> 6 -> 10 -> 3 -> null (false)

给定 list3:8 -> 8 -> 3 -> null (true)

这是我目前的做法:

class Linkedlist {
    var head: Node? = null

    data class Node(val value: Int, var next: Node?)

    // Current approach
    fun isListSorted(): Boolean {
        // If list is empty
        if (head == null) return true

        var curr = head

        while(curr != null) {
           curr = curr.next

           if (curr?.value!! <= curr?.next?.value!!) return false else return true
        }
        return true
   }
}

这里是我的主要内容:

fun main() {
    val list1 = Linkedlist()
    list1.append(8)
    list1.append(5)
    list1.append(3)

    val list2 = Linkedlist()
    list2.append(8)
    list2.append(6)
    list2.append(10)
    list2.append(3)

    val list3 = Linkedlist()
    list3.append(8)
    list3.append(8)
    list3.append(3)

}

我得到一个 NullPointerException。我究竟做错了什么?我感谢每一个帮助!

【问题讨论】:

    标签: sorting kotlin linked-list


    【解决方案1】:

    Kotlin 最吸引人的特性之一是空值安全性。除非您使用 !! 运算符,否则您不会得到 NullPointerExceptions。 !! 运算符仅应在您检查过代码并且从逻辑上知道在代码中的那个点上,参数不能为空时使用,但要弄清楚这一点的逻辑对于编译器来说太多了。

    您在curr 的值可以为空的地方使用!! 运算符。您设置了curr = curr.next,而next 将是null 在列表的尾部,因此当您在其上使用!! 运算符时,curr 将是null

    这行代码无论如何都没有意义,因为您从这里的if/else 的两个分支返回,因此您不可能检查列表中的多个节点。

    一种可能的方法:

    fun isListSorted(): Boolean {
        var curr = head ?: return true
    
        while(true) {
            val next = curr.next ?: return true
            if (curr.value < next.value)
                return false
            curr = next
        }
    }
    

    【讨论】:

    • 现在可以使用了,非常感谢。但是你能解释一下你的代码吗?这个 "?: return true" 到底是什么意思,while 循环什么时候结束?
    • 这样我们可以使currnext 不可为空参数,因为如果它们为空,我们继续并返回真。 elvis ?: 运算符让函数在值为 null 时立即返回。那么就不需要使用!!,因为我们已经正确处理了值为空的情况。所以while 循环会持续运行,直到遇到空尾或者遇到未排序的next
    • 但是如果列表是排序的呢?除非遇到未排序的下一个循环,否则我不完全了解 while 循环何时爆发?
    • 如果到达最后一个元素没有遇到乱序元素,curr.next会是null,所以会到达return true语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多