繁体   English   中英

以这两种方式更新方法中的链表的值之间有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM