2013-04-11 6 views
0

Я работаю над назначением связанных списков для моего класса ООП и столкнулся с некоторыми проблемами с методом удаления. Наш профессор попросил нас написать метод:Связанные списки - Удалить элемент по индексу

public Object removeElement(int index) 

Это занимает индекс, который является местоположением элемента, который необходимо удалить. Он должен также возвращать данные, которые был удален удаленный узел. Однако у меня возникают проблемы с тем, чтобы метод возвращал объект, который он удаляет. По какой-то причине я продолжаю получать ошибку, чтобы метод возвращал результат объекта типа. Я возвращаю объект, и я прошел пробную версию и ошибки в разных местах без успеха. Вот мой код:

public Object removeElement(int index) 
    { 
    ListIterator iterator = listIterator(); 
    Object object; 
    //If the supplied index is less than zero, throw an exception. 
    if(index < 0) 
    { 
     IndexOutOfBoundsException ex = new IndexOutOfBoundsException(); 
     throw ex; 
    } 

    else 
    { 
     for(int i = 0; i <= index; i++) 
     { 
      if(!iterator.hasNext()) 
      { 
       IndexOutOfBoundsException ex = new IndexOutOfBoundsException(); 
       throw ex; 
      } 
      else 
      { 
       if(i == index) 
       { 
        object = iterator.next(); 
        iterator.remove(); 
        return object; 
       } 
       else 
       { 
        iterator.next(); 

       } 
      } 
     } 
    } 

}

+0

ошибка Придает ли номер строки? Каково полное сообщение об ошибке? – iamnotmaynard

+0

Ошибка не в компиляции, она находится в методе, прежде чем я даже скомпилирую. – Legare

+2

@ DanielPikul: Это эффективно * есть * ошибка компиляции. Это просто ваша IDE, которая в основном компилируется по мере ввода. –

ответ

3

У вас есть он возвращающий объект еслиi == index. Но компилятор не знает, что цикл на самом деле всегда заканчивается в этот момент. Он смотрит на нижнюю часть цикла и думает: «Что мы хотим вернуть, если мы придем сюда?»

Я бы на самом деле перестроить свой код:

if (index < 0) 
{ 
    // No need for a separate variable 
    throw new IndexOutOfBoundsException(); 
} 

// No need for an else block 
ListIterator iterator = listIterator(); 
Object current = null; 
for (int i = 0; i <= index; i++) 
{ 
    // Note: assuming you expose the size(), you could check this up front... 
    if(!iterator.hasNext()) 
    { 
     throw new IndexOutOfBoundsException(); 
    } 
    current = iterator.next(); 
} 
iterator.remove(); 
return current; 

Теперь вы всегда вызов remove и вернуться, когда вы назвали next() заданное число раз, потому что, когда цикл закончится только посредством исключение.

+0

Как я могу это исправить? У меня есть метод, бросающий исключение, если оно не доходит до него, я надеялся, что это позаботится об этом. – Legare

+0

Хорошо, я сравниваю их очень быстро. – Legare

+0

Отлично! Спасибо!!! Я фактически сохранил свой код и просто установил Object в null изначально и написал обратную линию за пределами циклов. Ваш код был намного проще и помог мне подумать об этом. – Legare

0

Реализация метода Pls postIterator() и сообщение об ошибке, которое вы получаете. Примечание:> Вам нужно управлять размером списка, используя переменную класса, такую ​​как целое число. Таким образом, у вас нет проверки! Iterator.hasNext(), вместо сравнения индекса с текущим размером.

+0

LinkedLists не имеют индекс сохраненного размера, то есть ArrayLists. Я должен использовать hasNext(); – Legare

+0

LinkedLists не имеют размера? Что это [это] (http://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html#size()), то? – jahroy

+0

Что-то, что нам не разрешено использовать в этом классе. Мы используем пользовательское подмножество LinkedList, написанное нашим профессором. Я должен был это разъяснить. – Legare

1

Во-первых, не используйте итератор из java LinkedList это Doubly linked list, я думаю, профессор хочет видеть, как вы реализуете функцию удаления для структуры данных LikedList.

Во-вторых сделать петлю и условия, при которых i+1 == index в этом месте, сохранить текущий элемент для возвращения как Node returnElement = curent.next; и сделать удаление манипуляция curent.next = curent.next.next;

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