2017-01-03 94 views
1

我在写一个使用Linkedlist的队列结构。我正在编写将这些元素添加到队列的方法。由于该问题指定该方法应该具有void enqueueCharacter(char ch)的签名,因此我编写了带签名的另一种方法void enqCharacter(queueNode q,char ch),并在enqueueCharacter中调用了此方法。以这两种方式更新方法中的LinkedList值有什么区别?

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

这里是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)并且什么也不做SE。在enqCharacter(queueNode q,char ch)中,我检查q是否为null,如果是,则将第一个元素添加到q中,否则对q.tail执行相同的操作。但我检查,结果我从来没有真正改变队列的值,但它应该因为我通过队列的方法(我试过传递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); 
} 

我做了这些改变,只是因为我没有其他的想法,不是因为我觉得这是更好的,但它的工作。我仍然不知道为什么。

任何人都可以解释为什么我应该更新尾巴而不是队列本身?非常感谢你!

回答

2

Java是'传递值'。

当您将q.tail作为参数发送给方法时,您将发送该值,因为这是引用类型,该值将是此引用(q.tail)引用的对象位置。

因此,当q.tail为空时,您将向方法enqCharacter发送空值(即空引用)作为参数,然后将新的queueNode对象分配给此空引用。

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

+0

哦,我明白了。但是如果我想发送队列的引用,无论它是否为空,我该怎么办?使用和排队? – sy19890515

+0

在你的情况下考虑一个链:ABC:假设A是B的朋友,B是C,C是没有朋友的朋友,现在你想把某人附加到C作为朋友,因此你发送这个nobody(空引用)作为参数方法和参数为nobody(null),方法赋予一个新的品牌人对这个没有人说D,但是没有办法可以把那个D附加到C上,因为方法没有C的引用把D附加到它上面。因此,D仍然在宇宙中的某个地方漂浮,而不依附于任何人。 你也不能在java中使用&队列。 – vvtx

+0

噢谢谢你解释! – sy19890515

相关问题