Есть задача найти середину связанного списка. Не могли бы вы объяснить, почему цикл fast.next
in while()
выдает «Ошибка типа: невозможно прочитать свойства нуля (чтение «далее»)»?
const middleNode = (head) => {
let fast = head
let slow = head
if (head !== null) {
while (fast.next !== null) {
fast = fast.next.next
slow = slow.next
}
}
return slow
}
ваш цикл должен проверить while (fast && fast.next)
И если вы это сделаете, вам не нужно утверждение if
.
Допустим, у вас есть связанный список с двумя узлами: [1]-[2]
initial:
fast = [1]
slow = [1]
first iteration (fast.next = [2] != null)
fast = fast.next.next = null
slow = slow.next = [2]
second iteration (attempts to check fast.next = (null.next) => raises TypeError)
Исправление состоит в том, чтобы изменить свое условие, чтобы проверить оба fast && fast.next
. Затем вы также можете удалить проверку if.
const middleNode = (head) => {
let fast = head;
let slow = head;
while (fast && fast.next) { // fast != null && fast.next != null
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
Если у fast.next нет следующего узла, fast.next.next будет нулевым, поэтому на следующей итерации, когда вы проверяете
fast.next !== null
Вы пытаетесь получить доступ к следующему свойству нулевого объекта. Вы можете сначала проверить, существует ли fast следующим образом:
while (fast!=null && fast.next !== null) {
fast = fast.next.next
slow = slow.next
}
Если
fast.next.next
равно нулю, тоfast = fast.next.next
подойдетfast = null;
. Затемfast.next !== null
получает ошибку.