每个节点在链表中扮演哪个角色?

时间:2018-10-07 11:37:42

标签: java algorithm oop linked-list

为什么每次我们创建新节点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;
}
}

2 个答案:

答案 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;

在这种情况下,phead指向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

singly linked list

read about singly linked list here