ListNodes在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

我在读java中的节点。。我发现了这个例子。。我就是不明白ListNode在java中是如何工作的。。我确实读过,但还是不明白。。代码如下:

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。这有意义吗?我认为绘制正在发生的事情的图片将有助于澄清正在发生的事情