В этой статье блога мы рассмотрим различные методы обращения связанного списка с помощью Kotlin. Мы обсудим детали реализации и приведем примеры кода для каждого метода. К концу этой статьи вы получите полное представление о различных подходах к обращению связанного списка в Kotlin.
Метод 1: итеративный подход
Итеративный подход — это простой и понятный способ инвертировать связанный список. Он включает в себя перемещение списка от начала до конца, изменение указателей «следующий» по пути для изменения связей.
fun reverseListIterative(head: ListNode?): ListNode? {
var prev: ListNode? = null
var current = head
while (current != null) {
val nextNode = current.next
current.next = prev
prev = current
current = nextNode
}
return prev
}
Метод 2: рекурсивный подход
Рекурсивный подход использует рекурсивную функцию для обращения связанного списка. Он рекурсивно вызывает сам себя, пока не достигнет конца списка, а затем корректирует указатели, чтобы обратить соединения.
fun reverseListRecursive(head: ListNode?): ListNode? {
if (head?.next == null)
return head
val reversedList = reverseListRecursive(head.next)
head.next?.next = head
head.next = null
return reversedList
}
Метод 3: стековой подход
Стековой подход предполагает использование структуры данных стека для реверсирования связанного списка. Он помещает каждый узел в стек, а затем извлекает их в обратном порядке, чтобы создать обратный список.
fun reverseListStack(head: ListNode?): ListNode? {
val stack = Stack<ListNode>()
var current = head
while (current != null) {
stack.push(current)
current = current.next
}
val reversedList = stack.pop()
var currentNode = reversedList
while (stack.isNotEmpty()) {
currentNode.next = stack.pop()
currentNode = currentNode.next
}
currentNode.next = null
return reversedList
}
В этой статье мы рассмотрели три различных метода реверса связанного списка в Kotlin. Мы обсудили итеративный подход, который предполагает итеративное изменение указателей next. Мы также рассмотрели рекурсивный подход, который использует рекурсивные вызовы для изменения соединений. Наконец, мы рассмотрели подход со стеком, в котором мы использовали структуру данных стека для инвертирования связанного списка. В зависимости от вашего варианта использования и предпочтений вы можете выбрать наиболее подходящий метод реверса связанного списка в Kotlin.