ListNodes在java实现中是如何工作的
我在读java中的节点。。我发现了这个例子。。我就是不明白ListNode在java中是如何工作的。。我确实读过,但还是不明白。。代码如下:ListNodes在java实现中是如何工作的,java,Java,我在读java中的节点。。我发现了这个例子。。我就是不明白ListNode在java中是如何工作的。。我确实读过,但还是不明白。。代码如下: public class SingleLinkedList<E> { private ListNode<E> first; / ** Creates an empty list. * / public SingleLinkedList() { first = null; } / ** Returns a
public class SingleLinkedList<E> {
private ListNode<E> first;
/ ** Creates an empty list. * /
public SingleLinkedList() {
first = null;
}
/ ** Returns a list of the elements that match e.
otherwise returned an empty list. * /
public SingleLinkedList<E> allMatches(E e) {
SingleLinkedList<E> res = new SingleLinkedList<E>();
ListNode<E> n = first; // why we create a new node and put it equal to first ?
while (n != null) {
if (n.element.equals(e)) {
ListNode<E> tmp = new ListNode<E>(n.element);
tmp.next = res.first; // what is happening here ?
res.first = tmp; // why we do this step?
}
n = n.next;
}
return res;
}
private static class ListNode<E> {
private E element;
private ListNode<E> next;
/* Creates a listnode which contains e. */
private ListNode(E e) {
element = e;
next = null;
}
}
}
公共类单链接列表{
私有列表节点优先;
/**创建一个空列表。*/
公共单链接列表(){
第一个=空;
}
/**返回与e匹配的元素列表。
否则返回一个空列表。*/
公共SingleLinkedList所有匹配项(E){
SingleLinkedList res=新的SingleLinkedList();
ListNode n=first;//为什么我们要创建一个新节点并将其等于first?
while(n!=null){
如果(n.元素等于(e)){
ListNode tmp=新ListNode(n.element);
tmp.next=res.first;//这里发生了什么?
res.first=tmp;//为什么要执行此步骤?
}
n=n.next;
}
返回res;
}
私有静态类ListNode{
私人电子元件;
私有listnodenext;
/*创建包含e的listnode*/
专用ListNode(E){
元素=e;
next=null;
}
}
}
我不理解allMatches方法。。。我把一些评论放在每一行我不明白的地方
第一个问题:listnoden=First;//为什么我们要创建一个新节点并将其放在第一位?
第二个问题:tmp.next=res.first;//这里发生了什么?
第三个问题:res.first=tmp;//为什么要执行此步骤?
第四个问题:if(n.element.equals(e)){//在这种情况下我们能用==代替equals吗?
你能回答我的问题吗?谢谢
第一个问题:ListNode n=First;//为什么我们要创建一个新节点并将其与First相等
此处未创建新节点。将创建引用并引用第一个。仅当使用新运算符时才会创建新节点。由于我们将逐个扫描链接列表,因此将为其分配第一个。仅具有对第一个节点的引用就足够了,因为第一个节点包含对第二个节点的引用(如果存在)
第二个问题:tmp.next=res.first;//这里发生了什么
allMatches(e)方法返回元素值等于e.element的所有节点的链接列表。只要有匹配项,就创建一个新节点。这个新节点指向当前的第一个元素。这已经完成了一半。请阅读下一个问题的答案,然后试着理解
第三个问题:res.first=tmp;//为什么要执行此步骤
这里res.first用新创建的节点更新。为什么?因为我们使新节点指向当前第一个元素。由于此新元素位于当前第一个元素之前,我们必须更新第一个元素以指向新创建的节点
第四个问题:如果(n.element.equals(e)){//在这种情况下我们能用==代替equals吗
不。因为==只有当两者都是相同的对象时才有效。这里可能有对象不同但内容相同的机会。这实际上取决于它在应用程序中的使用方式。一般来说,答案是否定的。我认为新节点n首先被指向的原因是因为您要创建一个新的单独节点称为res的链表,是一个新的链表,只包含搜索结果,您希望它指向链表中的第一个节点,您将检查该节点,即调用该方法的列表。 之所以tmp.next=res.first,是因为我们将在res中插入tmp作为新的第一个元素,并在其后附加旧的res。这有意义吗?我认为绘制正在发生的事情的图片将有助于澄清正在发生的事情