Это потому, что если вы сначала позвоните slow.next = prev
, вы потеряете ссылку на то, что будет first.next.next
.Почему это так?
Для ваших инициализаций:
fast -> head
slow -> head
prev -> null
Теперь в вашем цикле while вы проверяете, не указывает ли fast.next
на null
.Следовательно, fast.next.next
является действительным.Однако обратите внимание, что slow.next
указывает на ту же ссылку, что и fast.next
.Для объяснения мы скажем, что оба они указывают на адрес памяти, называемый SOMETHING.
fast (HEAD) -> next -> SOMETHING
slow (HEAD) -> next -> SOMETHING
ЕСЛИ вы положите fast.next.next
на вершину цикла while, это допустимо, потому что этовсе еще указывает на что-то.
Если вы поместите fast.next.next внизу цикла while, тогда строка slow.next = prev
сначала установит head.next
как null
.
Вы теперь изменили head.next
, чтобы указать ни на что.Поскольку fast также указывал на голову, fast.next
теперь также указывает на ноль.
fast (head) -> next -> NULL
Поэтому вызов fast.next.next вызовет исключение нулевой ссылки.
Hopeэто помогает.