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
    }
}

但是,鉴于您的实现,您实际上永远不会创建第二个节点——您只有原始节点,并且您破坏了您的链表。

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;设置指向当前对象的下一个指针,创建一个只有一个元素的循环链表。您需要创建一个新元素。您还有一个有趣的问题,即假设您要添加项目的方向。您可以添加到列表的前面或列表的后面,但请注意,添加到前面意味着将指针更改为前面. 你可以很容易地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 类型的实例变量restRest与aTest具有相同的引用。当您说aTest.rest.data时,它是aTest.data的另一种说法,数据的当前值为6。这就是为什么你得到 5, 6, 6 作为输出。

于 2013-03-25T17:04:17.393 回答