我正在阅读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?
请你回答我的问题?感谢
答案 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。那有意义吗?我想画出正在发生的事情将有助于澄清正在发生的事情。