-1
public class SinglyLinkedList implements Lista {
private final Element _headAndTail = new Element(null);
private int _size;

public SinglyLinkedList() {
    clear(); 
}

private static final class Element {

    private Object _value;
    private Element _next;

    public Element(Object value) {
        setValue(value);
    }

    public void setValue(Object value) {
        _value = value;
    }

    public Object getValue() {
        return _value;
    }

    public Element getNext() {
        return _next;
    }

    public void setNext(Element next) {
        assert next != null : "Wskaźnik na element następny nie może być pusty";
        _next = next;
    }

    public void attachBefore(Element e) {
        setNext(e);
        e.setNext(this);
    }
}

public void insert(int index, Object value)
        throws IndexOutOfBoundsException {
    if (index < 0 || index > _size)
        throw new IndexOutOfBoundsException();
    Element element = new Element(value);
    element.attachBefore(getElement(index));
    ++_size;
}

private Element getElement(int index) {
    return getElementForwards(index);
}

private Element getElementForwards(int index) {

    Element element = _headAndTail.getNext();
    for (int i = index; i > 0; --i)
        element = element.getNext();
    return element;
}

private void checkOutOfBounds(int index) throws IndexOutOfBoundsException {
    if (index < 0 || index >= size())
        throw new IndexOutOfBoundsException();
}

public void add(Object value) {
    insert(size(), value);
}

public int size() {
    return _size;
}

public Object get(int index) throws IndexOutOfBoundsException {
    checkOutOfBounds(index);
    return getElement(index).getValue();
}

public Object set(int index, Object value) throws IndexOutOfBoundsException {
    checkOutOfBounds(index);
    Element element = getElement(index);
    Object oldValue = element.getValue();
    element.setValue(value);
    return oldValue;
}

public Object delete(int index) throws IndexOutOfBoundsException {
    checkOutOfBounds(index);
    Element element = getElement(index);
    --_size;
    return element.getValue();
}

public boolean delete(Object value) {
    Element e = _headAndTail.getNext();
    while (e != _headAndTail && !value.equals(e.getValue()))
        e = e.getNext();
    if (e != _headAndTail) {
        --_size;
        return true;
    }
    else
        return false;
}

public boolean contains(Object value) {
    return indexOf(value) != -1;
}

public void clear() {
    _headAndTail.setNext(_headAndTail);
    _size = 0;
}

public int indexOf(Object value) {
    int index = 0;
    Element e = _headAndTail.getNext();
    while (e != _headAndTail && !value.equals(e.getValue())) {
        e = e.getNext();
        ++index;
    }
    return e != _headAndTail ? index : -1;
}

public boolean isEmpty() {
    return _size == 0;
}

public Iterator iterator() {
    return new ValueIterator();
}

private final class ValueIterator implements Iterator {

    private Element _current = _headAndTail;

    public void first() {
        _current = _headAndTail.getNext();
    }

    public void last() {
    }

    public boolean isDone() {
        return _current == _headAndTail;
    }

    public void next() {
        _current = _current.getNext();
    }

    public void previous() {
    }

    public Object current() throws IndexOutOfBoundsException {
        if (isDone())
            throw new IndexOutOfBoundsException();
        return _current.getValue();
    }
}

}

これは私のコードです。問題なくコンパイルされています。このような二重リンク リストを作成しましたが、問題なく動作しました。単独に変更すると、リストにオブジェクトが追加されません。問題はメソッドinsert(int index, Object value)attachBefore(Element e)Elementクラスだと思います。

4

1 に答える 1

1

には概念上の問題がありElement.attachBefore(e)ます。基本的に、単一リンクリストに対してそのメソッドを実装することはできません。Element代わりに、挿入したい場所の前に を見つけ、Element その後に新しいものを挿入する必要があります。(そして、リストの先頭に挿入する特殊なケースに対処してください。)

詳細はお任せします...

しかし、ナレンドラのコメントは的を射ています。コードの現在のバージョンが何をしているのかわからない場合は、IDE の Java デバッガーを使用してコードを実行し、問題を引き起こしているメソッドへの呼び出しをシングル ステップで実行します。

于 2013-03-07T14:49:18.743 に答える