Kotlin связанный список: как проверить, отсортирован ли данный список (по убыванию) - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь написать функцию, которая определяет, отсортирован ли данный связанный список (по убыванию).

Данный список 1: 8 -> 5 -> 3 -> null (true)

Данный список2: 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. Что я делаю не так? Ценю любую помощь!

1 Ответ

3 голосов
/ 05 мая 2020

Одна из самых привлекательных особенностей Kotlin - нулевая безопасность. Вы не получите исключений NullPointerExceptions, если не используете оператор !!. Оператор !! следует использовать только в том случае, если вы проверили свой код и логически знаете, что в этой точке кода параметр не может иметь значение null, но logi c, чтобы понять это, слишком много для компилятора.

Вы используете оператор !! в месте, где значение 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...