Java 每个节点在链表中扮演什么角色?
为什么每次创建新节点时都要将Java 每个节点在链表中扮演什么角色?,java,algorithm,oop,linked-list,Java,Algorithm,Oop,Linked List,为什么每次创建新节点时都要将p.next分配给this.next?不是总是null吗?它在LinkedList中扮演什么角色? 如果我们试图打印出这个。下一步它将是null,然后我们将它分配给null System.out.println(this.next); 结果为null System.out.println(p.next); 另外,如果p.next指向新的节点为什么需要将p=p.next设置为指向同一节点?如果最终要将tail设置为p,我们就不能只设置tail=p.next,这是fo
p.next
分配给this.next
?不是总是null吗?它在LinkedList
中扮演什么角色?
如果我们试图打印出这个。下一步
它将是null,然后我们将它分配给null
System.out.println(this.next);
结果为null
System.out.println(p.next);
另外,如果p.next
指向新的节点
为什么需要将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;
}
}
公共类EnkeltLenketListe{
私人T值;
私有节点下一步;
专用节点(T值,节点下一个)
{
System.out.println(this.next);
this.next=next;
这个值=值;
}
}
私有节点头、尾;
公共eNKELTLISTE(T[]a)
{
这个();
int i=0;对于(;i
尝试使用矛盾。如果未设置p=p.next
,则在循环的下一次迭代中,您将再次将新节点设置为上一个节点的下一个位置。因此,p
始终是头部
,您不再移动p
因此,在设置p.next
之后,您需要在每次迭代中移动p
。实际上,它是指向列表中最后一个元素的指针
为什么每次创建新节点p.next时都需要为this.next分配null
在添加和删除节点时,我们必须确保节点不会指向意外节点。它们可能指向某些节点
为什么需要将p=p.next设置为指向同一节点
要在遍历列表时定位并保持您在列表中的位置,请从头部开始,然后继续到其余节点。如果p=p.next
,您将如何遍历列表
我们不能只设置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;
}
}
不,我们不能,因为在这种情况下,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.next
指向节点1
(见下图),其中指向节点0
的asp
现在设置为指向节点1
。所以两者都指向“节点1”。最后一点:
tail = p;
你说我们为什么不干脆下一步呢?不,我们不能,因为在这种情况下,p.next
相当于p.p.next
,因为p
在循环内被设置为p.next
neste指的是什么?对不起,我修好了。它是用另一种语言写的,我只是把它改成了英语。neste=next(挪威语)在穿越时保持了他在列表中的位置。是的,我的朋友,我得到了这个,但是为什么我们需要
p
?我们需要将tail
分配给最后一个节点,并且最后一个节点是在for循环中创建的最后一个节点,所以我们不能只在for循环集tail=p之后?所以我们不需要在每次迭代中设置p=p,是吗?@husseinalbiroutitail
是不够的。在每次迭代中设置p.next
时,应移动p
,以避免在上一次迭代中重写未来数据,以确保我理解它。p、 next是一个创建节点的对象,p是一个引用,它引用了当前节点?p
和p。next
是对节点的对象的引用,p
指向当前节点,其中asp.next
指向下一个节点。请您向我解释p.next
在for循环内部和for循环之后如何指向节点。正如你在回答中提到的,我在p.next
之前测试tail=p
时得到了空值,我在for循环内部测试了它,得到了节点的地址,那么是什么改变了p.next
在for循环之后变成了null
呢?如果在循环的一侧有p.next
,你在循环的外侧尝试p.next
,这相当于p.next.next