Единственное различие, которое я вижу между использованием манекена и неиспользованием, заключается в том, что необходимо удалить первый элемент в списке. В этом случае без использования манекена не удастся удалить головной узел. Тем не менее, это можно легко исправить, добавив простую проверку во время начального l oop.
Вот мое решение без использования фиктивной головы.
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode slow = head, fast = head;
for(int i = 0; i <= n ; i++){
if (fast == null) {
return head.next;
}
fast = fast.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
Чтобы ответить ваши другие вопросы,
разве мы не просто углубляемся в список / фиктивный
глубокого копирования не происходит, так как макет хранит ссылку на голова, а не копия.
зачем нам возвращать dummy.next, если мы вообще не внесли никаких изменений в dummy.
манекен определен быть перед головой. поэтому, когда мы хотим вернуть измененную голову, мы возвращаем следующий узел после пустышки. Если бы мы просто вернули пустышку, то перед ответом, который мы получили бы, было бы лишнее 0
, которое нам не нужно.