2017-01-03 212 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

相關問題