用这两种方式更新方法中Linkedlist的值有什么区别



我正在使用Linkedlist编写一个队列结构。我正在编写向队列添加元素的方法。由于问题指定该方法应具有void enqueCharacter(char ch)的签名,因此我编写了另一个具有void enqCharacter(queueNode q,char ch)签名的方法,并在enquecharacter内部调用了该方法。

起初它失败了,我不知道为什么。我做了一个小小的改变只是为了尝试,它起了作用。但事实上,我认为他们要么都成功,要么都失败,因为(我认为)他们有完全相同的概念。

以下是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 );
}

其概念是在调用enqueeCharacter(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引用。

但在第二种情况下,您在任何情况下都不会将null引用作为参数发送给enqCharacter,因此您可以在第二个情况下保留该链,因为您有对该链的引用。在第一种情况下,一旦将null作为参数发送,然后分配一个全新的queueNode对象,就会丢失引用。

最新更新