我试图为链表设计一个 get 方法。它将一个 int 位置作为参数,并返回给定位置的列表元素(位置从零开始)。
我认为我的逻辑是正确的,但没有编译。谁能指出我在这里做错了什么?
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");
}
}