2

宿題のサイクリックシングルリンクリストの最後に要素を追加しようとしています。しかし、どういうわけか私は多くの問題を抱えています。

私は_tailポインタを持っています、そして_dummy。JUnitテストのaddメソッドは、addメソッドをチェックすると、1ではなくnullを返すことを示しています(1はリストに追加されたものです)

これが私のコードです

 private static class Node<T>{
    Node<T> next;
    T data;
    public Node(T data, Node<T> next){
        this.next = next;
        this.data = data;
    }
}

private Node<T> _tail;
private int _count;
private int _version;
private Node<T> _dummy;  

 public CyclicLinkedList(){
    _dummy = new Node<T>(null, null);
    _dummy.next = _dummy;
    _tail = _dummy;
    _count = 0;
    assert _wellFormed();
}

これが私のaddメソッドです

@Override
public boolean add(T x){
    assert _wellFormed();

    Node<T> n = new Node<T>(x, _tail.next);
    _tail.next = n;
    _tail = n;

    ++_version;
    ++_count;

    assert _wellFormed();
    return true;
}

assertWellformedは、リンクリストが誤って循環していると述べています。_wellFormed()メソッドは、クラスインストラクターによってすでに実装されているため、問題はありません。いくつかのポインタが必要です!ありがとう。これは、テストが誤って循環しているかどうかを確認するためのテストです。

 // check for cycles:
    Node<T> fast = _tail.next;
    for (Node<T> p = _tail; fast != null && fast.next != null && fast != _tail       && fast.next != _tail; p = p.next) {
        if (p == fast) return _report("list is wrongly cyclic");
        fast = fast.next.next;
    }
4

1 に答える 1

0
_tail.next = n;
    _tail = n;

add メソッドのコードの先頭にもう 1 行追加する必要があります。

n.next = _tail.next;

したがって、コードは次のようになります。

n.next = _tail.next;
_tail.next = n;
_tail = n;

循環させるには、新しいノードが最初のノードを指すようにする必要があります。

そして、新しいノードをに追加する前に、最初_tail.nextの要素を指している必要があると思います。List_tail.nextn.nextnnode

したがって、最初の行で、両方のノード: - nnode と_tailnode は最初のノードを指します。_tailここで、ノードを最初のノードから切り離し、そのnノードを指すようにします。最後に、nノードをノードとして作成し_tailます。

于 2012-10-28T18:30:36.780 に答える