#java #linked-list
#java #связанный список
Вопрос:
Я пытаюсь удалить данный узел из связанного списка. Я не знаю, почему мой код не работает. Какие-либо подсказки? Итак, у меня есть [11,21,31,41], и они просят меня удалить узел с индексом 2 в данном случае 31. Пока у меня есть это:
public void delete (int k) {
//[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
if (k < 0 || k >= N) throw new IllegalArgumentException ();
for(Node x = first; x != null; x = x.next) {
//deletes node
if(x.item == k){
x = x.next;
}
if(x.item <= k){
x = x.next.next;
}
}
}
Может кто-нибудь сказать мне, пожалуйста, почему это не работает? Спасибо
Комментарии:
1. Какую ошибку вы получаете? Или это просто не удаление элемента.
2. это вообще не удаление элемента…
3. Вам нужно установить next для вашего предыдущего узла на next для узла, который вы хотите удалить (при условии, что это односвязный список)
4. Как вы думаете, почему это сработает?
Ответ №1:
Вы можете перемещать узлы, используя next k
times . Сохраните временный int и предыдущий узел. Уменьшайте временный int при каждом вызове next()
. Как только вы достигнете 0 (нужного элемента), удалите, установив следующий указатель предыдущего узла на следующий указатель x, а затем установите x
значение null
.
Я думаю, что в вашем коде вам не хватает той части, где установлены указатели.
Например:
(1) -> (2) -> (3)
Чтобы удалить (2)
, установите (1).next = (3)
и (2) = null
. Это приведет к:
(1) -> (3)
Ответ №2:
Здесь происходит несколько ошибок, и я рекомендую вам поработать над некоторой отладкой println, чтобы лучше понять проблемы по мере разработки.
-
Предполагая
item
, что поле является значением узла, вы сравниваете это значение узла с индексом указанного узла (напримерx.item == k
). -
Общая логика, которой вы захотите следовать, такова: «если узел, на который указывает итератор, является следующим узлом в моем списке, установите для my
next
значение itsnext
» .
Ответ №3:
В вашем коде вы сравниваете значение узла с переданным вами индексом. Это сравнение всегда будет иметь индекс меньше значения в узле. Также после этого вы не обновляете узел, если предполагаете, что код правильный.
Приведенный ниже код должен дать вам результат.
public void delete (int k)
{
//[ 11 21 31 41 ].delete( 2 ): expected=[ 11 21 41 ]
if (k < 0 || k >= N) throw new IllegalArgumentException ();
int count = 0;//Assuming index starts from 0
Node prev;
for(Node x = first; x != null; x = x.next)
{
//deletes node
count ;
if(count<k)
{
prev = x;
continue;
}
else
{
prev.next = x.next;
x.next = null;
break;
}
}
if(count>k || count<k)
{
System.out.println("No element with index k");
}
}
Ответ №4:
@vase правильно говорит
Предполагая, что поле элемента является значением узла, вы сравниваете это значение узла с индексом указанного узла (например, x.item == k).
некоторый пример кода, который мог бы это исправить
public void delete(int k){
Node n = first;
for(int i = 0; i < k-1; i ){ // this loop finds the node right before the
n=n.next; // index to use to delete the desired index.
}
n.next = n.next.next; // delete command
}