ListNodes如何在java实现中工作

时间:2016-01-09 20:52:10

标签: java

我正在阅读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;
    }
  }
}

我不明白allMatches方法......我在每行旁边放了一些评论我不明白...

第一个问题:ListNode<E> n = first; // why we create a new node and put it equal to first ?

第二个问题:tmp.next = res.first; // what is happening here ?

第三个问题:res.first = tmp; // why we do this step?

第四个问题:if (n.element.equals(e)) { // can we use == instead of equals in this case?

请你回答我的问题?感谢

2 个答案:

答案 0 :(得分:0)

  

第一个问题:ListNode n = first; //为什么我们创建一个新节点并将其等于第一个?

此处未创建新节点。创建引用,它首先引用。仅在使用新运算符时才创建新节点。它首先被分配,因为我们将逐个扫描链表。仅仅引用第一个节点就足够了,因为如果存在,则首先包含对第二个节点的引用。

  

第二个问题:tmp.next = res.first; //这里发生了什么?

方法allMatches(e)返回所有节点的链表,其元素值等于e.element。只要匹配,就创建一个新节点。此新节点指向当前的第一个元素。这是完成一半。阅读下一个问题的答案,然后尝试理解。

  

第三个问题:res.first = tmp; //为什么我们这样做?

这里使用新创建的节点更新res.first。为什么?因为我们使新节点指向当前的第一个元素。由于这个新元素在当前第一个元素之前,我们必须更新第一个元素以指向新创建的节点。

  

第四个问题:if(n.element.equals(e)){//我们可以在这种情况下使用==而不是equals吗?

不。因为==只有两者都是同一个对象才有效。这里可能存在对象不同但内容相等的可能性。这实际上取决于它在应用程序中的使用方式。一般来说,答案是否定的。

答案 1 :(得分:0)

我认为首先指出新节点n的原因是因为您要创建一个名为res的新单独链接列表,这是一个仅包含搜索结果的新链接列表,您想要它指向您将检查的链表中的第一个节点,即调用该方法的列表。 tmp.next = res.first的原因是因为我们要在res中插入tmp作为新的第一个元素,我们将在它之后附加旧的res。那有意义吗?我想画出正在发生的事情将有助于澄清正在发生的事情。