附加到链表

dav*_*vid 6 initialization linked-list list

我想知道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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ver*_*ern 6

回答你的问题:

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

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

问:"还有'节点n =这个','是什么意思?"

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

问:"每当我们声明一个对象Node的新实例时,它是否会从类中复制出自己独立的字段?"

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

因此,在您的创建过程中,您可能会遇到以下情况:

在此输入图像描述

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

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


Vin*_*nie 6

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

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

  public Node(int d) { 
       data = d; 
  }
Run Code Online (Sandbox Code Playgroud)

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

   Node x = new Node(10);
Run Code Online (Sandbox Code Playgroud)

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

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

   x.appendToTail(20);
Run Code Online (Sandbox Code Playgroud)

让我们追踪发生的事情.

    Node end = new Node(d);
Run Code Online (Sandbox Code Playgroud)

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

    Node n = this;
Run Code Online (Sandbox Code Playgroud)

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

    while (n.next != null) { 
        n = n.next; 
    }
Run Code Online (Sandbox Code Playgroud)

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

    n.next = end;
Run Code Online (Sandbox Code Playgroud)

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

  10 -> 20 -> null
Run Code Online (Sandbox Code Playgroud)

假设您要进行以下调用:

  x.appendToTail(30);
Run Code Online (Sandbox Code Playgroud)

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

  10 -> 20 -> 30 -> null
Run Code Online (Sandbox Code Playgroud)