Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是;这";参考链接列表示例中的?_Java_Linked List - Fatal编程技术网

Java 什么是;这";参考链接列表示例中的?

Java 什么是;这";参考链接列表示例中的?,java,linked-list,Java,Linked List,因此,我正在浏览编码面试,以复习一些面试内容,我偶然发现了这个链表实现,可能已经有一段时间了,但它完全超出了我的头脑。除了一句特别的话,我了解大部分内容,这让我很反感。我将在下面发布代码(作为参考,这本书没有提到语言,但它似乎是Java。) 类节点{ Node next=null; int数据; 公共节点(intd){ 数据=d; } 无效附加邮件(int d){ 节点端=新节点(d); 节点n=这个; while(n.next!=null){ n=n.next; } n、 下一个=结束; }

因此,我正在浏览编码面试,以复习一些面试内容,我偶然发现了这个链表实现,可能已经有一段时间了,但它完全超出了我的头脑。除了一句特别的话,我了解大部分内容,这让我很反感。我将在下面发布代码(作为参考,这本书没有提到语言,但它似乎是Java。)

类节点{
Node next=null;
int数据;
公共节点(intd){
数据=d;
}
无效附加邮件(int d){
节点端=新节点(d);
节点n=这个;
while(n.next!=null){
n=n.next;
}
n、 下一个=结束;
}
}
我有点困惑:
Node n=this
-我不确定this指的是什么,除非它指的是
next
-在这种情况下,为什么不将其设置为
null

这是Java


”指正在进行调用的类的特定实例。在本例中,“
this
”是指您正在处理的特定类
节点。而变量“
end
”创建了一个新的独立版本的
节点
类,该类是使用传递的int“
d
”构造的

引用类的对象的特定实例。由于对象是构造的,一个类可以有多个实例,但是使用
this
关键字可以获得对自身的引用,这意味着对其方法被调用的对象的特定实例的引用

链表是链接在一起的节点的集合。调用
appendToTail()
时,节点将查看链接到自身的所有节点对象,并遵循该链。为了获得对自身的引用以遵循自己的链,将使用
this
关键字

您还会问为什么在本例中不使用
null
来初始化
n
。当循环约束中第一次调用
n.next
时,这将导致
NullPointerException
,因此它自己的引用被用作链表迭代的起点

这(双关语)一开始可能是一个令人困惑的话题,但让我们使用您提供的示例

Node n = this;
while(n.next != null) {
    n = n.next;
}
让我们假设列表中当前链接了4个对象,为了简单起见,调用
appendToTail()
的节点对象是列表的头部。下面是节点n的参考值,它保存在上面代码段中的每个循环迭代中

  • 我们指向自己-
    这个
  • 指向链接列表中的第二项。-<代码>此。下一步
  • 指向以下项目-
    this.next.next
  • 指向列表中的最后一项-
    this.next.next.next
  • 循环结束,因此当前引用的
    n=this.next.next.next
    。然后,我们将
    n
    的下一个值(其中
    n
    当前指向链接链的末端)设置为在方法开始时创建的新对象,从而使其成为列表的新末端。(
    n.next=end
    现在相当于
    this.next.next.next=end


    半不必要的编辑:这是用Java来解释的。在写了这个答案< /p> 后,有人添加了C++标签,因为这是一个链表,所有节点都连接起来,并且有一个起始节点(根)。因此,当使用它时,它将如下所示:

    Node root = new Node(6); //need an instance first
    root.appendToTail(5);
    root.appendToTail(3);
    //6->5->3
    
    由于这两个节点是连接的,我需要一个开始节点,并且需要检查是否有下一个节点。如果是,我需要更深入地搜索。当一个节点没有下一个节点时,它是当前的最后一个节点,可以添加我的新节点。因此,在Java中,它指的是类的当前实例。在我的示例中,root节点(因为我调用root.appendToTail)。因此,该方法将从节点(值6)搜索下一个没有下一个节点(值3的节点)的节点,并将其附加到该节点上。如果我可以得到一个子引用并调用child3.appendToTail,那么该方法将从child3而不是从我的根开始搜索


    当将n设置为null并重写while以从此开始时。next当使用appendToTail的当前节点没有下一个节点并且将引发NullPointerException时,您将遇到问题。

    节点n=this
    表示n个对象引用调用此方法的对象。 所以该方法循环到下一个对象,直到下一个对象为null,并将
    end
    节点分配到末尾

    让我们看看

    1 -- 2 -- 3 -- 4
    *
    |
    *
    obj
    
    您有一个指向节点1的
    obj
    对象。当你调用
    obj.appendToTail(5)

    最终结果:
    1--2--3--4--5
    任何节点实例都可以调用
    appendToTail()

    注意,这里实际上
    节点
    并没有将自身附加到列表的尾部,这里发生的是新节点被创建并添加到尾部,而不是调用方法的节点

    要实现这一点,首先我们需要找到给定当前
    节点的列表尾部

      // n is pointing to current Node
      while(n.next != null) {
                n = n.next;
            }
    
    一旦我们找到next==null的节点,这就是列表的尾部,因此我们现在可以在尾部追加新的
    节点

        // n points to current tail before next line is invoked
        n.next = end;
    
    至于为什么会出现这种情况:

        Node n = this;
    
    由于没有维护头部引用的
    LinkedList
    类,因此必须能够从任何给定节点进行迭代。这就是这里发生的情况,您从调用
    appendToTail
    的节点开始迭代,但此时该节点可以是任何东西,从头到尾

    作为旁注,如果手动实现链表,请确保实际使用了类LinkedLi
        Node n = this;
    
    class Node {
       //
    
       void appendToTail( int d ) {
           Node *end = new Node( d );
           Node n = this;
           // ...
       }
    }