В любом случае это хорошо. Создание класса LinkedList
позволит вам добавить к нему методы, но это излишне для решения проблемы с одним обратным связанным списком.
Связанный список - это просто набор узлов, где каждый узел ссылается на следующий со свойством объекта next
.
Если вы хотите добавить несколько удобных методов в LinkedList, тогда да, класс будет полезен. Но для одной проблемы, такой как обращение к списку, опубликованное вами решение предполагает, что функция принимает в качестве входных данных первый узел в списке и что каждый узел (просто объект JavaScript) имеет свойство next
.
Например, скажем, я решал проблемы со множеством связанных списков, и мне также нужно было создать связанный список из массива значений. Скажем, я также хотел легко проверить, возвращает ли функция (например, reverseLinkedList) правильный список. Я мог бы использовать класс как this
Тогда для проверки вышеуказанного решения будет так же просто, как:
Во-первых, переписать обратное решение так, чтобы оно принимало связанный список, а не только заголовок, и чтобы вы могли изменить свойство head
списка после его обращения:
const reverseLinkedList = (linkedlist) => {
let node = linkedlist.head;
let previous = null;
while(node) {
// save next or you lose it!!!
let save = node.next;
// reverse pointer
node.next = previous;
// increment previous to current node
previous = node;
// increment node to next node or null at end of list
node = save;
}
linkedlist.head = previous
return previous; // Change the list head !!!
}
Затем вы можете запустить этот тест:
var inputList = new LinkedList([1,2,3,4])
var expectedReversedList = new LinkedList([4,3,2,1])
var actualReversedList = reverseLinkedList(inputList)
console.log(inputList.isEqualTo(actualReversedList))
Кроме того, с точки зрения пространственной и временной сложности, поскольку вышеприведенное решение мутирует объекты, это пространство O (1), а поскольку оно повторяется через узлы только один раз, это O (N) сложность времени