2013-07-13 4 views
-3

Я пытался создать метод get для связанного списка. Он принимает позицию int в качестве аргумента и возвращает элемент списка в данной позиции (позиция начинается с нуля).Связанный список get method using recursive method

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

abstract public class AbstractListNode { 

    abstract public Object first (); 
    abstract public AbstractListNode rest (); 
    abstract public boolean isEmpty (); 
    abstract public int size(); 
    abstract public Object get(int index); 
    // Every other list-processing method goes here. 
} 

class NonemptyListNode extends AbstractListNode { 

    private Object myFirst; 
    private AbstractListNode myRest; 

    // cons in Scheme. 
    public NonemptyListNode (Object first, AbstractListNode rest) { 
     myFirst = first; 
     if (rest == null) { 
     myRest = new EmptyListNode (); 
     } else { 
     myRest = rest; 
     } 
    } 

    public NonemptyListNode (Object first) { 
     this (first, new EmptyListNode ()); 
    } 

    // car in Scheme. 
    public Object first () { 
     return myFirst; 
    } 

    // cdr in Scheme. 
    public AbstractListNode rest () { 
     return myRest; 
    } 

    public boolean isEmpty () { 
    return false; 
    } 

    public int size () { 
     return 1+myRest.size(); 
    } 

    public Object get(int index){ 
     if(index+1 > this.size()) 
      throw new IllegalArgumentException ("Out of Range"); 
     else if(index == 0){ 
      return myFirst; 
     } 
     else{ 
      index = index-1; 
      AbstractListNode l = this.myRest; 
      l.get(index); 
     }   
    } 
} 

class EmptyListNode extends AbstractListNode { 

    public EmptyListNode () { 

    } 

    public Object first () { 
     throw new IllegalArgumentException ("There is no 'first' value stored in an EmptyListNode."); 
    } 

    public AbstractListNode rest () { 
     throw new IllegalArgumentException ("No elements follow an EmptyListNode."); 
    } 

    public boolean isEmpty () { 
     return true; 
    } 

    public int size() { 
     return 0; 
    } 

    public Object get(int index){ 
     throw new IllegalArgumentException ("Out of Range"); 
    } 
} 
+2

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

+0

_I думаю, что моя логика правильная, но не компилируется. Компилятор сообщает вам, в какой строке и столбце есть ошибки и какие ошибки имеет ваш код, поэтому, пожалуйста, вставьте его здесь. – BackSlash

+0

Извините. Я получил ошибку в методе «get» в классе NonemptyListNode. – heeh

ответ

3

я получил ошибку при методе GET в NonemptyListNode

Ошибка в том, что вы не имеете возвращенную заявление:

public Object get(int index){ 
    if(index+1 > this.size()) 
     throw new IllegalArgumentException ("Out of Range"); 
    else if(index == 0){ 
     return myFirst; 
    } 
    else{ 
     index = index-1; 
     AbstractListNode l = this.myRest; 
     l.get(index); 
     /* 
     * here you should have a return statement, if this else block 
     * gets executed, no returns will be found. 
     */ 
    }   
} 
+0

Похоже, что оператор if и else должен иметь операторы возврата. Благодарим вас за ответы и предложения. – heeh