2012-01-31 6 views
1

Привет Я создаю структуру связанных списков и внутри списка я определяю внутренний класс итератора. В настоящее время у меня проблемы с методом remove. Функциональность, которую я хочу, состоит в том, что она не может быть вызвана, если следующий не был вызван или текущий элемент в списке уже удален. Вот что у меня есть.Проблема с внутренними классами итераторов remove method

private class ListItr implements java.util.Iterator<E>{ 
private Node<E> currentNode; 
private Node<E> nextNode; 
private Node<E> previousNode; 


public ListItr(List<E> theList){ 
    previousNode = new Node<E>(null); 
    currentNode = new Node<E>(null); 
    nextNode = theList.head; 
    currentNode.setSuccessor(nextNode); 
} 

public boolean hasNext(){   
    return nextNode != null; 
} 

public E next(){ 
    if(nextNode == null) 
    throw new NoSuchElementException(); 

    previousNode = currentNode; 
    currentNode = nextNode; 
    nextNode = nextNode.getSuccessor(); 

    return currentNode.getElement(); 
} 

public void remove(){ 
    if(currentNode == null) 
    throw new IllegalStateException(); 
    nextNode = currentNode.getSuccessor(); 
    previousNode.setSuccessor(nextNode); 
    currentNode = null; 

    size--; 
} 

}

Как вы можете видеть, это будет успешно удалить узел в списке, сращивания вокруг него, установки текущего узла в нуль. Однако, если он вызывается первым без вызова следующего, он все равно будет работать, когда я этого не хочу. Я могу взломать его, добавив флаг nextNotCalled, установив его в true в конструкторе, а затем установив его false при следующем вызове, но я чувствую, что это не так, как это сделать ...

+1

Это домашнее задание? Если да, отметьте его соответствующим образом. Java уже имеет связанный список. – anubhava

+0

Я не понимал, что есть отдельная домашняя бирка, я буду помнить об этом, потому что будущие записи благодарны! – Erik

ответ

1

Если вопрос в общем, как это сделать, я бы посмотрел на how Josh Bloch and Neil Gafter. Посмотрите на определение класса для Itr (строка 330).

+2

Это для AbstractList, который предполагает эффективный поиск и удаление по индексу. Более релевантным будет http://www.docjar.com/html/api/java/util/LinkedList.java.html источник LinkedList. –

+0

Это хороший момент. –

+0

Спасибо, я сделаю это! – Erik

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