В вашем коде много чего происходит, вот несколько советов для некоторых из них:
В вашем классе Node: соглашения об именах Java: так же, как сеттеры должны иметь префикс «set», геттеры должны иметь префикс «get:» nextItem()
должно действительно быть getNextItem()
.
Также в вашем классе узлов: насколько я знаю, поле «следующее значение» узла связанного списка обычно является ссылкой на следующий узел в списке и поэтому должно иметь тип Node
, а не просто какой-либо объект. Это должно работать так, как у вас, но использование явной типизации намного безопаснее. (Пожалуйста, исправьте меня, если использование «Объекта» действительно является распространенным способом построения следующего узла связанного списка.)
В первом случае remove()
при удалении головки: вы перебираете список, чтобы достичь последнего значения, предположительно, чтобы сбросить его «следующее значение» на новую голову, но вы на самом деле не делает это. Вы хотите что-то вроде этого:
if (item == head) {
head = head.nextItem();
for(int i = 0; i < arrSize-1; i++){
cur = cur.nextItem();
}
}
cur.setNextItem(head);
Я не уверен, что вы надеетесь достичь со вторым циклом.
Во втором случае remove()
: я не уверен, что вы пытаетесь сделать со вторым циклом while
- сбросить все ссылки во всем списке? Весь смысл связанного списка состоит в том, чтобы сделать это ненужным. Удаление узла в связанном списке фактически не избавляет от объекта (поэтому вам не нужно устанавливать item
в null
). Скорее, вы просто «обходите» нежелательный объект и «игнорируете» его, фактически удаляя его из списка, как в:
Оригинальный список:
[ Value: A; Next: B ] --> [ Value: B; Next: C ] --> [ Value C; Next: D ] ...
После удаления узла B:
[ Value: A; Next: C ] --> [Value C; Next: D ] ...
[ Value: B; Next: C ]
все еще существует в памяти, но ничто не указывает на это, поэтому оно будет удалено в следующем цикле сборки мусора.
Для реализации: при просмотре списка сохраняйте ссылку на предыдущий узел, который вы посетили. Затем, когда вы найдете искомый элемент (используя правильное сравнение, как заметил Томас), вы можете просто установить prev.setNextItem(cur.nextItem());
(предостережение: непроверенный код):
Node prev = head;
Node cur;
while ((cur = prev.nextItem()) != head) {
if (cur.equals(item)) {
prev.setNextItem(cur.getNextItem());
return true;
}
}
Надеюсь, эти советы помогут вам на правильном пути.