Код должен выглядеть следующим образом:
public void deleteItem(int target)
{
int index = 0;
CarNode item = head;
CarNode prev = null;
while(item != null)
{
if (index == target) {
if (prev == null) {
head = item.getNode();
return; // We've removed the target.
} else {
prev.setNode(item.getNode());
return; // We've removed the target.
}
}
prev = item;
item = item.getNode();
index++;
}
}
Так давайте разберем это вниз:
int index = 0;
CarNode item = head;
CarNode prev = null;
Нам нужны две переменные: одна для хранения элемента мы смотрим на, другой сохраните предыдущий элемент (который мы будем использовать для повторного подключения списка после удаления элемента). Для начала наш текущий - это голова, а наше предыдущее не существует. index
сообщит нам, когда мы достигнем цели.
while(item != null)
Мы хотим перебрать, пока мы не попали в конец списка, отмеченный null
узлом.
if (index == target) {
if (prev == null) {
head = item.getNode();
return; // We've removed the target.
} else {
prev.setNode(item.getNode());
return; // We've removed the target.
}
}
Если мы нашли цель, мы удаляем ее. Если предыдущее значение равно NULL, цель была головой, поэтому мы перемещаем голову во второй элемент. В противном случае мы делаем ссылку предыдущего узла ссылкой на текущий узел, которая вырезает текущий узел из списка. Как только мы удалим цель, мы закончили, поэтому вернемся.
prev = item;
item = item.getNode();
index++;
Обновить предыдущие и текущие узлы. Оба перемещаются вперед на один узел. Индекс увеличивается.
Как о приведенном примере:
Возьмите список размера 3. Он выглядит следующим образом:
Мы теперь называем list.deleteItem(1);
Это инстанцирует prev
и next
узла. next
указывает на первый узел, а prev
- null.
Наша цель 1, таким образом, мы переходим к следующему узлу. Теперь prev
указывает на то, что next
используется для указания, и next
указывает на 2-й объект в списке (тот, который мы хотим удалить).
Снимаем его, установив ссылку на prev
узла быть ссылка на next
узла.
Когда мы возвращаемся из метода, сбор мусора Java делает свою работу, и мы остались с:
Тада! Узел удален из списка!
Предлагаю вам ознакомиться с ссылкой и переформулировать ваш вопрос. Очень сложно понять, с чем вы столкнулись. _ «ссылка имеет преимущество перед оригиналом, когда мы модифицируем узел ссылки» _, похоже, не имеет большого смысла даже в контексте вашего кода. Можете ли вы отредактировать свой пост и перефразировать конкретный вопрос? –
по ссылке i означает следующее и предыдущее, а не пункт. – user2089523
Покажите нам определение 'CarNode' ... а также строку' CarNode next = (item.node) .node; 'похоже, что оба содержат ошибку (один из этих' node 'должен быть' next') _and_ также может означать, что следующий указатель находится в данных, хранящихся в списке, а не в списке, что будет проблемой дизайна. –