如何在链表中创建根节点?

时间:2012-04-03 22:26:10

标签: java memory linked-list

我正在尝试用Java学习链接列表,并对下面的代码有一些疑问:

public class List {
    Node root;
    public List() {
        // constructor
    }

    public int pop() {
        // pop logic
    }

    public int push(int data) {
        // push logic
    }
}

我想要一个List类来弹出数据并将数据推送到链表中。但是,由于列表在实例化时没有任何默认数据,因此存储对根节点的引用的最佳方法是什么?

在C中,我只会有一个指针:

Node * root;

但是由于Java没有指针,因此会有一个简单的声明:

Node root;

......可以接受吗?我暂时没有使用Java,但是没有将内存分配给声明为类变量的对象导致潜在的内存问题?谢谢!

3 个答案:

答案 0 :(得分:3)

是的,像Node root这样的简单声明是可以接受的。它实际上不是指针,而是可以引用任何Node的引用。

Java中的引用在概念上等同于C指针,但灵活性较低,并且使用更简单的语法。

答案 1 :(得分:1)

是,

Node root;

可以接受。 Java中的每个非原始对象(包括基元或对象的数组)实际上是对对象的引用,因此它在很多方面就像一个C指针。

它实际上非常像指针,这个声明本身并不是实际创建一个对象。它是一个未指向任何内容的引用,如果您在先将root分配给new Node()之前尝试使用NullPointerException,则会获得{{1}}。

答案 2 :(得分:1)

是的,Node root;绝对没问题。只需确保不要更改root的值。要使用它,请创建另一个变量,以便遍历路径:Node start = root;这种方式root保持不变。

I haven't used Java in a while, but doesn't allocating memory to an object declared as a class variable cause potential memory issues?

不,不。虽然简单地写Node root;不会分配任何内存,root = new Node();会这样做。请注意,java中的class members是静态的,非静态成员是global variables。在java中将内存分配给全局变量是一种常见的做法。例如,实际存储列表的变量是一个全局变量,必须为其分配内存。

Java拥有强大的内存管理系统,因此您不会太容易遇到内存问题。