2017-10-06 68 views
0

所以我从头开始构建LinkedList。尽管代码有效,但我对两件事情感到困惑。引用,对象,LinkedList

当你写(public node root)你正在创建一个对象的引用?换句话说,这是一个指针?如果是,在方法add()我检查第一次迭代是否为根equalsnull,它是和代码创建该类的一个实例。

我的问题来自方法Find()。当根目录是null,并且我设置了temp1=root时,不是temp1也将是null因为rootnull?或者temp1指向rootroot指向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

如果你调用'查找()'那么你有可能已经被称为'加()'所以'root'没有更长的空。 – csmckelvey

+0

你的意思是如果我调用root在find()中使用我是从add()调用它?我认为这是从顶部调用.. – Armin

+0

当你说“如果我叫根”,我不确定你的意思。 'root'只是一个变量,你不会“调用”它。我在说,如果你有一个LinkedList实例并且你调用了Find()方法,那么这个列表可能会有一些内容调用之前的add()方法,这意味着root不再为null,因为它获取第一次调用add()时,就会返回值。即使您没有先调用add(),您的Find()也会有一个空检查来防止异常。 – csmckelvey

回答

0

Java中的任何对象值变量实际上是对存储在堆中的实际对象的引用。

在你Find方法,你分配参考roottemp1,你现在基本上是有2个引用相同Node对象。

如果你打电话Find调用addroot(和temp1因为它们指向同一个对象)是null所以这个函数总是返回false.

只有调用add,其中一个Node对象的引用将前后被分配到root,是否有可能返回true

0

当你写(公共节点根)你创建一个对象的引用?

是的。你正在声明一个Node类型的对象引用。由于您未初始化此参数值,因此参考值为空。 Java引用就像其他语言的指针,虽然有一些关键的区别。像指针一样,对象引用的值将是一个包含对象的内存地址。与其他语言不同,您不能使用Java引用进行指针运算。

Java Language Specification有此说关于这个问题:

参考值(通常只是引用)是指向这些 对象,和一个特殊的空引用,这是指没有对象。

我最初正在做一个更多的语法参数,但在回到JLS之后,我同意引用是指针,尽管Java中不支持C-Style指针操作。

当root为空,并且我设置temp1 = root时,temp1是否也会为null,因为root是null?

是的,温度将被分配根值。也就是说,它将引用root当前引用的同一个Node实例。如果在进行此调用时root为空,则temp1也将为空。

在你的代码中,你的可能(可能应该)像这样在构造函数中初始化你的根节点。每次在其他方法中调用新的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; 
    } 
} 
+0

如果我这样做,我们不会有一个额外的节点,数据将为0.我认为通过这样做我将有一个我没有声明的节点。至少我的编译器正在显示什么。 – Armin