[英]What is the difference between updating the value of a Linkedlist within a method in these two ways?
我正在使用Linkedlist编写队列结构。 我正在编写将元素添加到队列的方法。 由于问题指定该方法应具有void enqueueCharacter(char ch)的签名,因此我编写了另一种具有void void enqCharacter(queueNode q,char ch)的方法,并在enqueueCharacter内部调用了此方法。
起初它失败了,我不知道为什么。 我做了一个小的改动只是为了尝试并且奏效了。 但是实际上,我认为它们应该要么都起作用要么都失败,因为(我认为)它们具有完全相同的概念。
这是queueNode的定义:
class queueNode
{
char head;
queueNode tail;
queueNode(char c)
{
head = c;
tail = null;
}
}
和队列的声明:
queueNode queue = null;
这是我最初写来更新队列的内容:
public void enqCharacter(queueNode q, char ch)
{
if( q == null ) q = new queueNode( ch );
else enqCharacter( q.tail, ch );
}
public void enqueueCharacter(char ch)
{
enqCharacter( queue, ch );
}
这个概念是,一旦我调用enqueueCharacter(char ch),就立即调用enqCharacter(queue,ch),然后什么也不做。 在enqCharacter(queueNode q,char ch)中,我检查q是否为null,如果是,则将第一个元素添加到q,否则对q.tail进行相同操作。 但是我检查了一下,结果发现我从未真正更改过queue的值,但是这应该是因为我将queue传递给了方法(我也尝试传递this.queue,但仍然无法正常工作)。
然后我稍作更改:
public void enqCharacter(queueNode q, char ch)
{
if( q.tail == null ) q.tail = new queueNode( ch );
else enqCharacter( q.tail, ch );
}
public void enqueueCharacter(char ch)
{
if( queue == null ) queue = new queueNode( ch );
else enqCharacter( queue, ch );
}
我做出这些更改仅是因为我没有其他想法,不是因为我认为这样更好,而是成功了。 而且我仍然不知道为什么。
谁能解释为什么我应该更新尾巴而不是队列本身? 非常感谢你!
Java是“按值传递”。
当将q.tail作为参数发送给该方法时,您正在发送该值,因为这是引用类型,因此该值将是此引用(q.tail)所引用的对象位置。
因此,当q.tail为null时,您会将null值(即null引用)作为参数发送给方法enqCharacter,然后将新的queueNode对象分配给该null引用。
但是在第二种情况下,无论如何都不会将空引用作为参数发送给enqCharacter,因此在第二种情况下您可以保留该链,因为您已经对该链进行了引用。 在第一种情况下,一旦您将null发送为参数,然后分配了一个全新的queueNode对象,您就失去了参照。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.