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
的as
p
现在设置为指向
节点1
。所以两者都指向“节点1”。最后一点:

tail = p;
你说我们为什么不干脆下一步呢?不,我们不能,因为在这种情况下,
p.next
相当于
p.p.next
,因为
p
在循环内被设置为
p.next


neste指的是什么?对不起,我修好了。它是用另一种语言写的,我只是把它改成了英语。neste=next(挪威语)在穿越时保持了他在列表中的位置。是的,我的朋友,我得到了这个,但是为什么我们需要
p
?我们需要将
tail
分配给最后一个节点,并且最后一个节点是在for循环中创建的最后一个节点,所以我们不能只在for循环集
tail=p之后?所以我们不需要在每次迭代中设置p=p,是吗?@husseinalbirouti
tail
是不够的。在每次迭代中设置
p.next
时,应移动
p
,以避免在上一次迭代中重写未来数据,以确保我理解它。p、 next是一个创建节点的对象,p是一个引用,它引用了当前节点?
p
p。next
是对
节点的对象的引用,
p
指向当前节点,其中as
p.next
指向下一个节点。请您向我解释
p.next
在for循环内部和for循环之后如何指向节点。正如你在回答中提到的,我在
p.next
之前测试
tail=p
时得到了空值,我在for循环内部测试了它,得到了节点的地址,那么是什么改变了
p.next
在for循环之后变成了
null
呢?如果在循环的一侧有
p.next
,你在循环的外侧尝试
p.next
,这相当于
p.next.next