2016-10-05 2 views
1

Я пытаюсь удалить данный узел из связанного списка. Я не знаю, почему мой код не работает. Любые намеки? Поэтому у меня есть [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; 
     } 
    } 


} 

Может кто-нибудь сказать мне, пожалуйста, почему это не работает? Спасибо

+0

Что ошибка вы получаете? Или это просто не удаляет элемент. – denis

+0

он вообще не удаляет элемент ... – Hello

+1

Вам нужно установить следующий из предыдущего узла на следующий узел, который вы хотите удалить (при условии, что у вас есть отдельный список) – Zarwan

ответ

0

Вы можете перемещать узлы, используя следующий k раз. Храните временный int и предыдущий узел. Уменьшайте временный ввод каждый раз при вызове next(). Как только вы встанете на 0 (нужный элемент), удалите, установив следующий указатель предыдущего узла на следующий указатель x, а затем установите x в null.

Я думаю, что в вашем коде вам не хватает части, где установлены указатели.

Например:

(1) -> (2) -> (3) 

Чтобы удалить (2), установить (1).next = (3) и (2) = null. Это позволит получить:

(1) -> (3) 
0

Есть несколько вещей, идущих здесь не так, и я призываю вас работать на какой-то Println отладки, чтобы лучше понять проблемы, как вы развиваете.

  1. Предполагая item поля является значением узла, вы сравниваете, что значение узла с индексом указанного узла (например x.item == k).

  2. Общая логика, что вы будете хотеть, чтобы следовать за это, «если узел итератор указывает на это следующий узел в моем списке, установите мой next его next

0

В вашем коде вы сравниваете значение узла с указанным вами индексом. Это сравнение всегда будет иметь индекс меньше значения в узле. Также после этого вы не обновляете узел, когда считаете, что код верен.

Ниже код должен дать вам результат.

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"); 
} 
} 
0

@vase правильно говорят

Предполагая, что поле элемента имеет значение узла, вы сравниваете , что значение узла к индексу указанного узла (egxitem == к).

некоторый пример кода, который может исправить это

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 
} 
Смежные вопросы