附加到链表

时间:2011-05-04 01:00:07

标签: list linked-list initialization

我想知道while循环是如何执行的。因为我们在第一次声明它时将'next'设置为null,它什么时候变为not null?还有什么'节点n =这个; ' 意思?这个代码有意义吗?每当我们声明一个对象Node的新实例时,它是否会从类中复制它自己的单独字段?谢谢你!我一定会欣赏清晰易懂的解释。再次感谢=)

class Node {
    Node next = null;
    int data;
    public Node(int d) { data = d; }
    void appendToTail(int d) {
        Node end = new Node(d);
        Node n = this;
        while (n.next != null) { n = n.next; }
        n.next = end;
    }
}

3 个答案:

答案 0 :(得分:6)

回答你的问题:

问:“因为我们在第一次声明它时将'next'设置为null,它什么时候变为not null?”

如果列表中只有一个项目,则该节点的“下一个”值将设置为NULL。

问:“还有什么'节点n =这个;'是什么意思?”

此语句表示引用变量“n”采用当前对象的引用,该引用由“this”指定。

问:“每当我们声明对象Node的新实例时,它是否会从类中复制其自己的单独字段?”

将为您创建实例的每个单独的类创建实例变量。这意味着每个节点都有“下一个”和“数据”。

因此,在你的创作过程中,你可能会有这样的事情:

enter image description here

此外,while循环迭代到列表的末尾,并将该项追加到列表中的最后一个节点之后。

希望它有所帮助(:如果您有任何疑问,请回复(:

答案 1 :(得分:6)

所以你有一个名为Node的类,它有两个名为next和data的实例变量。它们被称为实例变量,因为它们属于此类的实例而不是类本身。也就是说,您的类基本上是对象的模板(或蓝图),每个对象都有自己的数据值和下一个值。

为了创建Node类的实例,您需要调用构造函数并传递必要的参数。在你的情况下,构造函数是;

  public Node(int d) { 
       data = d; 
  }

要调用此构造函数,请使用new关键字(在Java中我假设),像这样;

   Node x = new Node(10);

请注意,您必须为构造函数提供整数值。在构造函数的主体中(在{}之间),您会看到变量数据被赋值给d中的值,这是您传递给构造函数的值,在此示例中为值10.现在您有一个类型的对象节点的值为10作为数据,空值为下一个节点。

在该对象上,您现在可以调用方法appendToTail()。让我们说这样做:

   x.appendToTail(20);

让我们跟踪发生的事情。

    Node end = new Node(d);

创建了一个名为end的新节点,我们将值20设置为data(请记住d现在的值为20,因为这是我们调用方法时传递的值)。这是x中完全独立的节点,具有自己唯一的数据值。

    Node n = this;

这是对当前对象的自引用。因为我们在x上调用了这个方法,所以这是与x相同的对象。

    while (n.next != null) { 
        n = n.next; 
    }

这个while循环将从当前节点到下一个节点开始寻找列表的结尾,直到下一个节点为空。由于我们到目前为止创建的唯一节点是x,因此n.next实际上为null,因此while循环不执行此时间。

    n.next = end;

现在我们将n的下一个值(即x)设置为创建的节点端。你现在有一个这样的清单:

  10 -> 20 -> null

假设您要进行以下调用:

  x.appendToTail(30);

然后发生类似的事情,除非你到达while循环时,值n.next不为null所以你进入循环体并指定n指向n.next,在我们的例子中是n节点20.循环的下一次迭代将产生null,因此循环将退出,具有数据30的新节点将被设置为列表中最后一个节点的下一个值。所以你将拥有:

  10 -> 20 -> 30 -> null

答案 2 :(得分:1)

没有节点不复制自己。 链表的要点是让节点引用下一行。 因此,如果链表中有3个项目,则第一个节点对第二个节点有引用,第二个节点对第三个节点有引用。

Node one = new Node(1);
one.appendToTail(2);

将导致节点一,创建一个新节点,并将其放入其下一个字段 one.next.data将等于2.

one.appendToTail(3)

将导致节点1引用节点2,节点2将创建节点3,并将其设置为下一个字段。

one.data == 1
one.next.data == 2
one.next.next.data == 3

循环基本上是搜索行中的最后一个节点(因为它将下一个节点设置为空)。

相关问题