2015-09-23 4 views
2

Что мне не хватает, чтобы я мог удалить узел (boxcar) до конца моего связанного списка?Удаление конечного узла из связанного списка

public void removeBoxcarFromEnd() { 

    Boxcar prevcar = head; 
    Boxcar nextcar = head; 

    if (head.next == null) { 
     int result = head.data; 
     head = null; 
     return result; 
    }  
    else { 
     while (nextcar.next() > 2) 
     prevcar = nextcar; 
     nextcar = nextcar.next(); 
    } 
    prevcar.setNext(null); 
    size--; 
} 
+3

Пожалуйста, напишите [mcve] - образец (короткий) полный код, который ** может фактически скомпилировать ** (если у вас нет вопроса о его компиляции), что вы ** тестировали ** и ** нашли вопрос **, а затем ** опишите проблему ** в вопросе. – Dukeling

+0

Btw: у вас есть функция с возвращаемым типом 'void', но вы пишите' return result; '. – pzaenger

ответ

0

Есть несколько проблем с этим подходом:

  • Ты метод является void в то время как вы хотите, чтобы вернуть данные последнего пункта?

  • Ваш цикл while не использует скобки ({}), ни отступы, поэтому только prevcar = nextcar будет выполняться бесконечное количество раз.

  • Вы используете >2;

  • есть уголок, где связанный список также может быть пустым.

, вероятно, лучший способ справиться с этим:

public String removeBoxcarFromEnd() { 
    String result; 
    if(head == null) { //empty list 
     return null;  //or do something else? throw an exception? 
    } else if (head.next() == null) { //one element, remove it 
     int result = head.data(); 
     head = null; 
    }  
    else { //more elements 
     Boxcar prevcar = head, nextcar = head.next(), ffcar = nextcar.next(); 
     while (ffcar != null) { //double next iteration 
      prevcar = nextcar; 
      nextcar = ffcar; 
      ffcar = ffcar.next(); 
     } 
     int result = nextcar.data(); //get result 
     prevcar.setNext(null);  //remove it from the linked list 
    } 
    size--; 
    return result; 
} 
+0

Получение 'nextcar.next()' дважды каждой итерации .... –

+0

Я предполагаю, что это должно быть 'public int removeBoxcarFromEnd() {...}'. – pzaenger

+0

@pzaenger: действительно, слишком много копий-макарон;) –

0

Предполагая, что вы не должны получить данные, только удалить последнюю Boxcar:

public void removeBoxcarFromEnd() { 
    Boxcar prevcar = head; 
    Boxcar nextcar = head; 

    if (head == null || head.next() == null) { 
     return; 
    } 
    while (nextcar.next() != null) { 
     prevcar = nextcar; 
     nextcar = nextcar.next(); 
    } 
    prevcar.setNext(null); 
} 

Сначала мы проверяем для нулевой или одноэлементный список; в этих случаях нечего делать.

Далее мы переходим к списку, пока не дойдем до конца (то есть nextCar.next() возвращает null). На каждом шаге мы сохраняем Boxcar, которые мы передаем.

Когда мы выходим из цикла, prevcar указывает на второй по последнему слову автомобиль, и мы можем смело установить его next переменной на null.

Смежные вопросы