2 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
讓我們看看實(shí)際發(fā)生了什么:初始狀態(tài):
第一個(gè)包含 null,first.next 是最后一個(gè),最后一個(gè)包含 null
push:first不再包含null,仍然指向last,帶有null
enque:last.item為null,因此第一個(gè)cae被觸發(fā),現(xiàn)在列表如下:banana -> gorilla -> null,last指向gorilla
再次排隊(duì):現(xiàn)在 else 被觸發(fā)。如果您查看代碼,您會(huì)發(fā)現(xiàn) temp.next 沒有任何地方被觸及。這意味著作為 enque 之前的最后一個(gè)節(jié)點(diǎn)并被復(fù)制到 temp 的節(jié)點(diǎn)仍然指向空節(jié)點(diǎn)。
這最終會(huì)導(dǎo)致空指針異常。
缺少什么:temp.next=last
創(chuàng)建最后一個(gè)節(jié)點(diǎn)后,類似于 , 。
實(shí)際發(fā)生的情況是這樣的:
---> last ---> closing-null
---> temp ---> closing-null
---> last
看來您可以更干凈地實(shí)現(xiàn)這一點(diǎn),而無需空節(jié)點(diǎn)關(guān)閉列表。
然后你可以做這樣的事情:
node=new Node(item);
last.next=node;
node.prev=last;
last=node;

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
我不會(huì)給你完整的代碼,但我會(huì)把它可視化。之后您可以輕松地編寫代碼。
Next 是--->,Previous 是<---,last 指向最后一個(gè)節(jié)點(diǎn),first 指向第一個(gè)節(jié)點(diǎn)
假設(shè)你有這個(gè)清單。
Banana ---> Orange ---> Gorilla ---> null
<--- <---
^ ^
| |
first last
// First's previous and last's next is null.
你想在最后添加芒果。您創(chuàng)建一個(gè)新節(jié)點(diǎn)
DoubleNode node = new DoubleNode("Mango");
<--- Mango --->
// Note: When you create a new node by default both next and previous are null.
// You don't need to point them to null later
步驟1:
last.next(newNode);
Banana ---> Orange ---> Gorilla ---> Mango
<--- <---
^ ^
| |
first last
第2步:
newNode.previous(last);
Banana ---> Orange ---> Gorilla ---> Mango
<--- <--- <---
^ ^
| |
first last
現(xiàn)在我們有新的最后一個(gè),所以我們將更新最后一個(gè)
last = newNode
Banana ---> Orange ---> Gorilla ---> Mango
<--- <--- <---
^ ^
| |
first last
從構(gòu)造函數(shù)中我們知道 Mango 的 next 已經(jīng)為 null,因此newNode.next(null);沒有必要。
您可能會(huì)遇到 nullpointerException 的原因
添加第一個(gè)元素后,您的列表如下所示
null <--- Banana ---> null null
^ ^
| |
first last
從技術(shù)上講,你應(yīng)該將第一個(gè)和最后一個(gè)點(diǎn)都指向香蕉,因?yàn)槟銢]有這樣做。當(dāng)你將某些東西放入隊(duì)列時(shí),比如說大猩猩。這將是
null.item = "Gorilla"
null.next = null
添加回答
舉報(bào)