2013-04-26 6 views
0

Привет, я пытаюсь удалить ссылку в части связанного списка, но я не уверен, как удалить ссылку. когда я запускаю его, ссылки все еще там. im используя junit для проверки функции, если это имеет значение.удалить из связанного списка со списком

Вот что у меня есть.

public void removeAt(int k) 
{ 
    Node w = first; 
    int counter = 0; 
    if (k<0 || k >= size()) 
    { 
     throw new IndexOutOfBoundsException("Error "); 
    } 
    else 
    { 
     while (w!= null) 
     { 
     counter++; 
     if (counter == k) 
     { 
      Node now = w.next; 
      w= now.next; 
     } 
     w=w.next; 
     } 
    } 
    assert check(); 
} 

Спасибо за помощь

+0

Какова ваша текущая задача? Удалить элемент из связанного списка? –

+0

да, я пытаюсь удалить элемент из ссылки, но каждый раз, когда я проверяю, что это то же самое –

+0

Я думаю, вам нужно убедиться, что вы понимаете, что такое 'связанный список' на самом деле. Что связывает это вместе. Когда вы это знаете, ваша задача состоит в том, чтобы извлечь один элемент из списка, сохранив связанный статус всех остальных элементов. Это похоже на то, что вам нужно будет удалить только один автомобиль из поезда. –

ответ

0

Вам необходимо изменить .next поле узла-для того, чтобы удалить узел, например, w.next = w.next.next удаляет узел w.next из списка (потому что ничего больше не указывает на него); обязательно проверьте нулевые указатели (если w.next имеет значение null, тогда w.next.next выдает исключение). Кроме того, добавьте оператор break в конец вашего блока if, так как нет необходимости перемещать остальную часть списка.

0
if (counter == k){ 
    Node now = w.next; 
    w.next= now.next; 
    break; 
} 

проверить это.

0

Вы обновляете локальную переменную. Что вам нужно сделать, это обновить ссылку до текущего узла:

if (k == 0) 
    { 
     first = first.next ; 
     // you also have to free the memory for first. 
    } 
    else 
    { 
    Node Last = first ; 
    w = first.next ; 
    counter = 1 ; 
    while (w!= null) 
    { 
     counter++; // Not sure your conventions, but I think this should be at the end 
     if (counter == k) 
     { 
      last.next = w.next ; /// happily skipping w :) 
      // remember you have to free w 
      break ; // no point in continuing to the end. 

     } 
     w=w.next; 
    } 
    } 
    } 
0

Вы всегда должны следить за предыдущий узел. А также, что, если узел, который должен быть удален, является первым узлом? Я думаю, вы должны изменить блокироваться, чтобы посмотреть что-то вроде:

Node l = first; 
while (w!= null) 
{ 
    if (counter == k) 
    { 
     if (w == first) 
      first = w.next; 
     else  
      l.next = w.next;    
     w.next = null;     
     break; 
    } 
    l=w; 
    w=w.next; 
    counter++; 
} 
0

Проверьте следующий код, который удалить элемент из связанного списка,

public void delete(T element){ 

     if(head != null){ // first check your header node is null or not 

      // create two references of your linked list 
      Node<T> tmp = head; // it will hold current value 
      Node<T> tmp1 = head.getNextRef(); // it will hold next value 


      while(true){ // iterate through whole linked list 

       if(head.getValue() == element){ // if you found element at first place 
        head = head.getNextRef(); // then point head to next node of it 
        break; 
       } 

       if(tmp1.getValue()==element){ // to remove node refer to next of tmp1 
        tmp.setNextRef(tmp1.getNextRef()); 
        break; 
       }else{ 
        tmp = tmp1; 
        tmp1 = tmp1.getNextRef(); 

        if(tmp1==null) 
         break; 
       } 
      } 
     } 
    } 
Смежные вопросы