2013-10-11 53 views
0

這是一個家庭作業問題。我有一個雙鏈接節點類,實現了Iterable的循環雙鏈表類和一個實現迭代器的迭代器類。我理解一個迭代器的概念,其中一個隱式遊標位於兩個節點之間,並在調用next()時返回它剛剛跳過的節點。我用一個新的列表對象創建了一個測試類。然後我創建了一個迭代器,然後調用next,我收到了正確的No Such Element exception,但是當我向列表中添加了一些節點時,我收到了Null Pointer Exception,而不是它返回最後返回的節點。我該如何解決這個問題?圓形雙鏈表ListIterator

我的節點類:

public class DoubleLinkedNode<E>{ 
private E data; 

private DoubleLinkedNode<E> next; 

private DoubleLinkedNode<E> prev; 


public DoubleLinkedNode(E data, DoubleLinkedNode<E> next, DoubleLinkedNode<E> prev){ 
    this.data = data; 
    this.next = next; 
    this.prev = prev; 
} 
/** 
* Used to construct a node that points to null for its prev and next. 
* @param data Data is a generic variable to be stored in the node. 
*/ 
public DoubleLinkedNode(E data){ 
    this(data, null, null); 
} 


//getters 
public E getData(){ 
    return data; 
} 

public DoubleLinkedNode<E> getNext(){ 
    return next; 
} 

public DoubleLinkedNode<E> getPrev(){ 
    return prev; 
} 
//setters 
public void setData(E data){ 
    this.data = data; 
} 

public void setNext(DoubleLinkedNode<E> next){ 
    this.next = next; 
} 

public void setPrev(DoubleLinkedNode<E> prev){ 
    this.prev = prev; 
} 

@Override public String toString(){ 
    if(data == null){ 
     return null; 
    } 
    else{ 
     return data.toString(); 
    } 
} 

} 

列表類的私有內部迭代器類:

import java.util.Iterator; 
import java.util.ListIterator; 
import java.util.NoSuchElementException; 


public class CircularDoubleLinkedList<E> implements Iterable<E>{ 

private int size; 
private DoubleLinkedNode<E> head; 


public CircularDoubleLinkedList(){ 
    this.head = null; 
    this.size = 0;  
}  
/** 
* Adds an item to the end of the list. 
* 
* @param data The Data that is to be stored in the node. 
*/ 
public void add(E data){  
    DoubleLinkedNode<E> newNode = new DoubleLinkedNode<E>(data); 
    if(this.head == null){ 
     newNode.setNext(newNode); 
     newNode.setPrev(newNode); 
     this.head = newNode; 
     this.size++; 
     //if list is empty create a new node and insert 
    } 
    else{ 
     DoubleLinkedNode<E> temp = this.head.getPrev(); 
     this.head.getPrev().setNext(newNode); 
     this.head.setPrev(newNode); 
     newNode.setPrev(temp); 
     newNode.setNext(this.head);  
     this.size++; 
    } 
} 
/** 
* Which adds an item at the specified index. 
* 
* @param index The index in which the new Node is added. 
* @param data The data which is to be stored in the node. 
*/ 
public void add(int index, E data){ 
    int currIndex = 0; 
    DoubleLinkedNode<E> currNode = this.head; 
    DoubleLinkedNode<E> nextNode = this.head.getNext(); 
    DoubleLinkedNode<E> prevNode = this.head.getPrev(); 
    DoubleLinkedNode<E> newNode = new DoubleLinkedNode<E>(data); 
    if(index == 0){ 
     prevNode.setNext(newNode); 
     currNode.setPrev(newNode); 
     newNode.setPrev(prevNode); 
     newNode.setNext(currNode); 
     this.head = newNode; 
     this.size++;  
    } 
    else if (index > 0){   
     while(currIndex != this.size){ 
      if(currIndex != index%size){ 
       currIndex++; 
       currNode = currNode.getNext(); 
       nextNode = nextNode.getNext(); 
       prevNode = prevNode.getNext();     
      }else{    
       newNode.setPrev(prevNode); 
       newNode.setNext(currNode); 
       prevNode.setNext(newNode); 
       currNode.setPrev(newNode); 
       currNode = newNode; 
       this.size++; 
       break;          
      } 
     }  
    } 
    else if (index < 0){ 
     while(currIndex != -this.size){ 
      if(currIndex != index%size){ 
       currIndex--; 
       currNode = currNode.getPrev(); 
       prevNode = prevNode.getPrev(); 
       nextNode = nextNode.getPrev(); 
      }else{    
       newNode.setNext(nextNode); 
       newNode.setPrev(currNode); 
       currNode.setNext(newNode); 
       nextNode.setPrev(newNode);   
       currNode = newNode; 
       this.size++; 
       break;          
      } 
     } 
    } 
} 
/** 
* Returns the data stored at the specified index. 
* 
* @param index The index determines the node whose data is returned. 
* @return Returns the data of the node at the index. 
*/ 
public E get(int index){//returns the data stored at the specified index 
    int currIndex = 0; 
    DoubleLinkedNode<E> currNode = this.head; 
    E temp = null;  
    if(index == 0){//zero case   
     temp = currNode.getData(); 
    } 
    else if(index > 0){//positive   
     while(currIndex != this.size){ 
      if(currIndex != index%size){ 
       currIndex++; 
       currNode = currNode.getNext();        
      }else{        
       temp = currNode.getData(); 
       break;          
      } 
     } 
    } 
    else if(index < 0){//negative  
     while(currIndex != -this.size){ 
      if(currIndex != index%size){ 
       currIndex--; 
       currNode = currNode.getPrev(); 
      }else{    
       temp = currNode.getData(); 
       break;          
      } 
     }   
    } 
    return temp; 
} 
/** 
* Which removes and returns an item from the list. 
* 
* @param index Removes the node at the current index. 
* @return Returns the data of the removed node. 
*/ 
public E remove(int index){//which removes and returns an item from the list 
    int currIndex = 0; 
    DoubleLinkedNode<E> currNode = this.head; 
    DoubleLinkedNode<E> nextNode = this.head.getNext(); 
    DoubleLinkedNode<E> prevNode = this.head.getPrev(); 
    E temp = null; 
    if(index == 0){ 
     temp = currNode.getData(); 
     prevNode.setNext(currNode.getNext()); 
     nextNode.setPrev(currNode.getPrev()); 
     this.head = nextNode; 
     size--; 
    } 
    else if(index > 0){//positive   
     while(currIndex != this.size){ 
      if(currIndex != index%size){ 
       currIndex++; 
       currNode = currNode.getNext(); 
       nextNode = nextNode.getNext(); 
       prevNode = prevNode.getNext();     
      }else{        
       temp = currNode.getData(); 
       prevNode.setNext(currNode.getNext()); 
       nextNode.setPrev(currNode.getPrev()); 
       currNode = nextNode; 
       size--; 
       break;          
      } 
     } 
    } 
    else if(index < 0){//negative  
     while(currIndex != -this.size){ 
      if(currIndex != index%size){ 
       currIndex--; 
       currNode = currNode.getPrev(); 
       prevNode = prevNode.getPrev(); 
       nextNode = nextNode.getPrev(); 
      }else{    
       temp = currNode.getData(); 
       prevNode.setNext(currNode.getNext()); 
       nextNode.setPrev(currNode.getPrev()); 
       currNode = prevNode; 
       size--; 
       break;          
      } 
     }   
    } 
    return temp; 
} 
/** 
* Returns the size. 
* 
* @return 
*/ 
public int size(){ 
    return size; 
} 
@Override public String toString(){ 
    String str = "["; 
    int index = 0; 
    DoubleLinkedNode<E> curr = head; 
    if(size == 0){ 
     return "There is no one here to kill.";   
    }else{  
     while (index <this.size) { 
      str += curr.getData(); 
      curr = curr.getNext(); 
      index++; 
       if (index<this.size) { 
        str += ", "; 
       } 
     } 
      str += "]"; 
    } 
    return str; 
    } 
@Override 
public Iterator<E> iterator() { 

    return new CircularDoubleIterator(); 
} 
// Iterator inner class begins 
private class CircularDoubleIterator implements ListIterator<E> { 

    private DoubleLinkedNode<E> nextItem;//reference to next item 
    private int index = 0; 
    private DoubleLinkedNode<E> lastReturned;// the last node to be returned by prev() or next() 
              // reset to null after a remove() or add() 

    @Override 
    public E next() { 
     if(!hasNext()){ 
      throw new NoSuchElementException("No such element."); 
     } 
     else{ 
          nextItem = head; //edited 11Sept13 
      lastReturned = nextItem.getNext(); 
      nextItem = nextItem.getNext(); 
          head = nextItem; //edited 11Sept13 
      index++; 
      return lastReturned.getData(); 


     } 
    } 

    @Override 
    public E previous() { 
     if(!hasPrevious()){ 
      throw new NoSuchElementException("No such element."); 
     } 
     else{  

     index--; 

     return ; 
     } 
    } 

    @Override 
    public int nextIndex() { 
     return index; 
    } 

    @Override 
    public int previousIndex() { 
     return index-1; 
    } 
    @Override 
    public boolean hasNext() { 
     return size != 0; 
    } 

    @Override 
    public boolean hasPrevious() {  
     return size!= 0; 
    } 
    @Override 
    public void remove() { 
    } 

    @Override 
    public void set(E theData) { 
     if(lastReturned == null){ 
      throw new IllegalStateException(); 
     } 
     else{ 
     } 

    } 

    @Override 
    public void add(E theData) { 
     if(size == 0){    
     } 
     else if(size != 0){ 
     } 

    } 

} 

//Iterator inner class ends 
} 

回答

0

我沒有看到你,當你創建迭代器賦值private DoubleLinkedNode<E> nextItem;。 我看不到整個代碼。所以我假設nextItem爲空或其next字段爲空。

+0

好吧,我將nextItem設置爲next(),next()方法返回第一個元素,但調用next元素返回相同的元素。看起來像每個next()調用它重置nextItem頭。 – Stickandjab

+0

好的!然後在我回到最後的迴歸之前,我將頭轉到下一個項目。它的工作原理,感謝將未分配的nextItem引入我的注意! – Stickandjab

+0

編輯下一個方法來顯示工作。 – Stickandjab