所以我从头开始构建LinkedList
。虽然代码有效,但我对两件事感到困惑。
当你写(public node root
)时,你正在创建对象的引用?换句话说这是指针吗?如果是,则在方法add()
中检查第一次迭代的根equals
到null
是否正确,并且代码创建该类的实例。
我的问题来自方法Find()
。如果root为null
,并且我设置了temp1=root
,那么temp1
也不会null
,因为root
是null
?或者temp1
指向root
而root
指向null
?这些有何不同?
编辑:如果temp1为null,那么为什么方法find()有效?
public class LinkedList {
public Node root;
public void add(int data) {
if(root == null) {
root = new Node(data);
}
else {
Node temp1 = root;
Node temp = new Node(data);
while(temp1.getNext() != null) {
temp1 = temp1.getNext();
}
temp1.setNext(temp);
}
}
public boolean Find(int data) {
Node temp1 = root;
while(temp1 != null) {
if(temp1.getData() == data) {
return true;
}
temp1 = temp1.getNext();
}
return false;
}
}
答案 0 :(得分:0)
Java中的任何对象值变量实际上是对存储在堆上的实际对象的引用。
在Find
方法中,您将root
的引用分配给temp1
,您现在基本上有两个对同一Node
对象的引用。
如果您在致电Find
之前致电add
,root
(和temp1
,因为他们引用相同的对象)是null
所以此功能将永远返回false.
仅在致电add
后,Node
对象的引用将被分配给root
,才有可能返回true
。
答案 1 :(得分:0)
当您编写(公共节点根目录)时,您正在创建对该对象的引用?
是。您正在声明Node类型的对象引用。由于您没有初始化它,因此参考值为null。 Java引用就像其他语言中的指针一样,尽管有一些关键的区别。像指针一样,对象引用的值将是包含对象的内存地址。与其他一些语言不同,您不能使用Java引用进行指针运算。
Java Language Specification可以说明这个问题:
参考值(通常只是引用)是指向这些的指针 对象,以及一个特殊的空引用,它不引用任何对象。
我最初做了一个更复杂的语法参数,但在回到JLS之后,我同意引用是指针,即使Java中不支持C风格的指针操作。
当root为null,并且我设置temp1 = root时,temp1也不会为null,因为root为null?
是的,temp将被赋予root的值。也就是说,它将引用root当前引用的同一个Node实例。如果在进行此调用时root为null,则temp1也将为null。
在你的代码中,可以(可能应该)在构造函数中初始化你的根节点。每次在其他方法中调用new LinkedList()时,这将初始化根节点。请注意,我做了一些其他的小改动,以使这个类更符合:
public class LinkedList {
// made this private
// be sure to add get/set methods to access/change this value
// if needed outside this class
private Node root;
// default (no-arg) constructor
public LinkedList() {
root = new Node();
}
public void add(int data) {
Node temp1 = root;
Node temp = new Node(data);
while(temp1.getNext() != null) {
temp1 = temp1.getNext();
}
temp1.setNext(temp);
}
public boolean find(int data) {
Node temp1 = root;
while(temp1 != null) {
if(temp1.getData() == data) {
return true;
}
temp1 = temp1.getNext();
}
return false;
}
}