Java 什么是;这";参考链接列表示例中的?
因此,我正在浏览编码面试,以复习一些面试内容,我偶然发现了这个链表实现,可能已经有一段时间了,但它完全超出了我的头脑。除了一句特别的话,我了解大部分内容,这让我很反感。我将在下面发布代码(作为参考,这本书没有提到语言,但它似乎是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、 下一个=结束; }
类节点{
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;
// ...
}
}