为什么每次我们创建新节点p.next
时都需要为this.next
分配 null ?并不总是为空吗?它在LinkedList
中扮演什么角色?
如果我们尝试打印出this.next
,则将其设置为 null 之前为 null 。
System.out.println(this.next);
结果为空
如果p.next
指向新的node
,为什么还要设置p = p.next
指向同一节点呢?如果要最后将tail设置为p的目的,我们不能只设置tail = p.next
,它是for循环完成后的最后一个。
public class EnkeltLenketListe<T>{
private T value;
private Node<T> next;
private Node(T value, Node<T> next)
{
System.out.println(this.next);
this.next = next;
this.value = value;
}
}
private Node<T> head, tail;
public EnkeltLenketListe(T[] a)
{
this();
int i = 0; for (; i < a.length && a[i] == null; i++);
if (i < a.length)
{
head = new Node<>(a[i], null);
Node<T> p = head;
for (i++; i < a.length; i++)
{
if (a[i] != null)
{
p.next = new Node<>(a[i], null);
p = p.next;
}
}
tail = p;
}
}
答案 0 :(得分:3)
尝试使用矛盾。如果未设置p = p.next
,则在循环的下一次迭代中,再次将新节点设置为上一个节点的下一个位置。因此,p
一直都是head
,而您不再移动p
!
因此,您需要在设置p
之后的每次迭代中移动p.next
。实际上,它是指向列表最后一个元素的指针。
答案 1 :(得分:3)
为什么每次创建新节点p.next时都需要为此null分配空值?
在添加和删除节点时,我们必须确保节点不指向意外的节点。他们可能已经指向某些节点。
为什么我们需要设置p = p.next指向同一节点
要在遍历列表时定位并保持在列表中的位置,请从头开始,继续到其余节点。如果是p=p.next
,将如何遍历列表?
我们不能只设置tail = p.next,它是for循环完成后的最后一个。
不,我们不能因为在这种情况下p.next
等效于p.p.next
,因为在循环内p
被设置为p.next
。在tail=p
之前添加以下内容进行测试,您应该会得到 null
System.out.println(p.next);
编辑:
您的列表是单链列表,这意味着除尾部以外的每个节点都应有一个指向下一个以您开始的节点的指针
head = new Node<>(a[i], null);
Node<T> p = head;
在这种情况下,p
和head
指向Node 0
,请参见下图。如果数组中的下一个NOde不为null,请查看for循环中发生的情况
p.next = new Node<>(a[i], null);
p = p.next;
在这种情况下,p.next
指向Node 1
(请参见下图),其中指向p
的{{1}}现在被设置为指向{{1 }}。因此两者都指向“节点1”。最后一个:
Node 0
您说过,为什么我们不只是Node 1
?不,我们不能,因为在这种情况下,tail = p;
等效于tail=p.next
,因为在循环中p.next
被设置为p.p.next
。