1

タイプ AClass の属性を含むクラス (AClass と呼ばれる) があります。これを使用して、整数のリンクリストを作成しようとしています。ただし、AClass のデータに値を与えるたびに、リンクされたすべてのクラスのデータがこの値に置き換えられます。

public class AClass {
    public AClass rest;
    public int data;

    public AClass (int tData) {
         data=tData;
         rest=null;
    }

    public void add(int item) {
        rest=this;          //This is what is causing the problem
        data=item;
    }

}

これは私がテストに使用しているものです。出力は 5,6,5 のはずですが、5,6,6 になっています。

public class Test {
    public static void main(String[] args) {
        AClass aTest=new AClass(5);      //Creates a list with on element.
        System.out.println(aTest.data);  //Print that element for verification
        aTest.add(6); 
        System.out.println(aTest.data);      //Print the end element
        System.out.println(aTest.rest.data); //Print the next element, which should be 5
    }
}

私は自分が間違っていることを理解できないようです。

4

3 に答える 3

3

リンクされたリストとは何か、そしてコードが何をするかについて考えてみましょう。

リンク リストは、一連のポインタによって連結された一連のノードです。あなたが説明した予想される動作に基づいて、このように構築されたリンクリストが必要です。

public class Test {
    public static void main(String[] args) {
        AClass aTest=new AClass(5);          // Data: aTest ==> (5) ==> null
        System.out.println(aTest.data);      // Prints 5.
        aTest.add(6);                        // Data: aTest ==> (6) ==> (5) ==> null
        System.out.println(aTest.data);      // Prints 6
        System.out.println(aTest.rest.data); // Prints 5
    }
}

ただし、実装を考えると、実際には 2 番目のノードを作成することはありません。元のノードしかないため、リンク リストが破損します。

public class Test {
    public static void main(String[] args) {
        AClass aTest=new AClass(5);          // Data: aTest ==> (5) ==> null
        System.out.println(aTest.data);      // Prints 5.
        aTest.add(6);                        // Data: aTest ==> (6) ==> (6) ==> (6) ==> forever
        System.out.println(aTest.data);      // Prints 6
        System.out.println(aTest.rest.data); // Prints 6
    }
}

addしたがって、新しいノードを作成する必要があります。

rest=this;次のポインターを現在のオブジェクトに設定し、1 つの要素だけの循環リンク リストを作成します。新しい要素を作成する必要があります。また、項目を追加する方向についても興味深い問題があります。リストの先頭または末尾に追加することができますが、先頭に追加するということは、ポインタを先頭に移動することを意味することに注意してください。 . addFrontと の両方をaddBack非常に簡単に実装できます。

public AClass addFront(int item) {
    AClass node = new AClass(item);
    node.rest = this;
    return node;
}

public void addBack(int item) {
    // Find the end of the list
    AClass temp = this;
    while (temp.rest != null) {
        temp = temp.rest;
    }
    temp.rest = new AClass(item);
}

以上のことから、組み込みのリンク リストhttp://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.htmlの使用を検討してください。

于 2013-03-25T16:59:31.640 に答える
2
public class AClass {
    public AClass rest;
    public int data;

    public AClass (int tData) {
         data=tData;
    }

    /**
     * Insert in front.
     * @param item data to be inserted.
     */
    public void add(int item) {
        // Make a copy of this:
        AClass copy = new AClass(data);
        copy.rest = rest;
        // Overwrite this object:
        rest = copy;
        data = item;
    }
}
于 2013-03-25T17:02:18.170 に答える
0

aTest.rest.data

参照変数aTestを使用して、タイプAClassのインスタンス変数restにアクセスしています。RestはaTestと同じ参照を保持します。aTest.rest.dataと言うときは、 aTest.dataの別の言い方です。データの現在の値は6です。そのため、出力として 5、6、6 が得られます。

于 2013-03-25T17:04:17.393 に答える