Собрать узлы односвязного списка в массив

Идите по next от head до nil и добавляйте каждый текущий узел в массив. Порядок обхода совпадает с порядком списка.

Короткий ответ

Что ответить на собеседовании

Идите по next от head до nil и добавляйте каждый текущий узел в массив. Порядок обхода совпадает с порядком списка.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо пройти по односвязному списку, начиная с его первого узла, и собрать все узлы в массив, сохранив порядок их следования.

class ListNode {
    let data: Int
    let next: ListNode?

    init(data: Int, next: ListNode?) {
        self.data = data
        self.next = next
    }
}

class Solution {
    public static func convert(head: ListNode) -> [ListNode] {
        
    }
}

Ответ

Идите по next от head до nil и добавляйте каждый текущий узел в массив. Порядок обхода совпадает с порядком списка.

public static func convert(head: ListNode) -> [ListNode] {
    var result: [ListNode] = []
    var current: ListNode? = head
    while let node = current {
        result.append(node)
        current = node.next
    }
    return result
}

Время O(n), память под результат O(n). Массив удерживает исходные объекты ListNode, а не их копии. В данном контракте head не optional, поэтому пустой список не представим; если он нужен, измените параметр на ListNode?. Для произвольных изменяемых списков с возможными циклами добавляют обнаружение повторно посещённых узлов.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее