Идите по 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?. Для произвольных изменяемых списков с возможными циклами добавляют обнаружение повторно посещённых узлов.