#java #singly-linked-list
#java #односвязный список
Вопрос:
Я хочу кое-что уточнить относительно удаления элементов из LinkedList. Учитывая этот код:
public boolean remove(int index)
{
// if the index is out of range, exit
if(index < 1 || index > size())
return false;
Node current = head;
for(int i = 1; i < index; i )
{
if(current.getNext() == null)
return false;
current = current.getNext();
}
current.setNext(current.getNext().getNext());
listCount--;
return true;
}
Из того, что я вижу, этот код заканчивается на элементе перед тем, который вы хотите удалить. Затем он присваивает узлу поле «next» после того, которое вы хотите удалить. Мой вопрос в том, не нужно ли вам присваивать полю «next» узла, который вы хотите удалить, значение null? Я немного смущен, потому что похоже, что поле «next» все еще указывает на элемент после, поэтому у вас есть 2 узла, указывающие на него.
Любая помощь будет оценена.
Комментарии:
1. Но этот элемент больше не будет доступен из списка, т. Е. С помощью методов списка это ни на что не повлияет.
Ответ №1:
вам не нужно присваивать «следующему» полю узла, который вы хотите удалить, значение null?
Для этого нет веской причины в Java.
Я немного смущен, потому что
Вы, должно быть, думаете о том, как работает другой язык, такой как C , где вы должны сделать это, чтобы очистить интеллектуальный указатель, поскольку он использует количество ссылок.
В Java ссылка — это просто 4-байтовый указатель (или индекс на объект)
похоже, что поле «next» все еще указывает на элемент после, поэтому у вас есть 2 узла, указывающие на него.
Это объект, на который нет ссылок, поэтому он фактически не существует. Все, что он делает, это тратит немного памяти, пока сборщик мусора не очистит ее.
Комментарии:
1. Спасибо, теперь это имеет смысл
Ответ №2:
похоже, что поле «next» по-прежнему указывает на элемент после
Это не важно, поскольку ничто не указывает на удаленный узел, в конечном итоге он будет автоматически удален сборщиком мусора.