2 回答
TA贡献1862条经验 获得超7个赞
让我们看看实际发生了什么:初始状态:
第一个包含 null,first.next 是最后一个,最后一个包含 null
push:first不再包含null,仍然指向last,带有null
enque:last.item为null,因此第一个cae被触发,现在列表如下:banana -> gorilla -> null,last指向gorilla
再次排队:现在 else 被触发。如果您查看代码,您会发现 temp.next 没有任何地方被触及。这意味着作为 enque 之前的最后一个节点并被复制到 temp 的节点仍然指向空节点。
这最终会导致空指针异常。
缺少什么:temp.next=last
创建最后一个节点后,类似于 , 。
实际发生的情况是这样的:
---> last ---> closing-null
---> temp ---> closing-null
---> last
看来您可以更干净地实现这一点,而无需空节点关闭列表。
然后你可以做这样的事情:
node=new Node(item);
last.next=node;
node.prev=last;
last=node;
TA贡献1818条经验 获得超7个赞
我不会给你完整的代码,但我会把它可视化。之后您可以轻松地编写代码。
Next 是--->,Previous 是<---,last 指向最后一个节点,first 指向第一个节点
假设你有这个清单。
Banana ---> Orange ---> Gorilla ---> null
<--- <---
^ ^
| |
first last
// First's previous and last's next is null.
你想在最后添加芒果。您创建一个新节点
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
现在我们有新的最后一个,所以我们将更新最后一个
last = newNode
Banana ---> Orange ---> Gorilla ---> Mango
<--- <--- <---
^ ^
| |
first last
从构造函数中我们知道 Mango 的 next 已经为 null,因此newNode.next(null);没有必要。
您可能会遇到 nullpointerException 的原因
添加第一个元素后,您的列表如下所示
null <--- Banana ---> null null
^ ^
| |
first last
从技术上讲,你应该将第一个和最后一个点都指向香蕉,因为你没有这样做。当你将某些东西放入队列时,比如说大猩猩。这将是
null.item = "Gorilla"
null.next = null
添加回答
举报