2011-05-04 74 views
6

我在想如何执行while循环。由于我们在首次声明时将'next'设置为null,它何时会更改为非空?还有什么'Node n = this; ' 意思?这对代码有意义吗?每当我们声明对象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; 
    } 
} 
+0

这是什么语言? – 2011-05-04 01:02:36

回答

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); 

命名结束一个新节点,我们设定的值20的数据(记住,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,在我们的例子中是20节点。循环的下一个迭代将产生null,因此循环将退出,新节点将与数据30将被设置为列表中最后一个节点的下一个值。所以你将有:

10 -> 20 -> 30 -> null 
+0

感谢您的帮助! – david 2011-05-04 02:07:04

6

回答您的问题:

问:“既然我们设置‘下一步’为空时,我们首先声明它,当它得到改变不空?”

当列表中只有一个项目时,该节点的'next'值将被设置为NULL。

问:“还有'Node n = this'是什么意思?”

该语句表示引用变量'n'取当前对象的引用,该引用由'this'指定。

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

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

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

enter image description here

此外,while循环迭代到列表的末尾,并在最后一个节点后附加物品名单。

希望它可以帮助(如果您有任何疑问,请回发(:

+0

+1对于一些优秀的图表 – 2011-05-04 01:20:37

+0

谢谢!我希望视觉方法能给出一个更好的主意(:只是希望能够帮助(:干杯! – Vern 2011-05-04 01:32:12

+0

非常感谢您的帮助! – david 2011-05-04 02:06:47

1

没有的节点不进行自我复制 链表的一点是要有一个节点指的是线下。 。 所以,如果你有一个LinkedList 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 

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

+0

感谢您的帮助! – david 2011-05-04 02:06:54