java - Java Linked List 无法将项目添加到末尾
问题描述
似乎无法正确添加最后一个元素。我将最后一项保存在临时节点中,然后创建一个新节点。然后我为每个节点链接上一个和下一个,然后将最后一个节点指向一个新的空节点。但是当我转到我的 print() 方法时,那个空节点似乎不是列表的一部分。
似乎它应该像我的推送方法一样简单,但我似乎无法让它像它一样工作。
public class LinkedListDeque {
public DoubleNode first = new DoubleNode(null);
public DoubleNode last = new DoubleNode(null);
public DoubleNode temp;
public int N;
LinkedListDeque() {
first.next = last;
last.prev = first;
}
public static void main(String[] args) {
LinkedListDeque link = new LinkedListDeque();
link.push("banana");
link.printList();
link.enqueue("gorilla");
link.printList();
link.enqueue("spam");
}
//nested class
private class DoubleNode {
String item;
int counter = 0;
DoubleNode next;
DoubleNode prev;
DoubleNode(String i) {
this.item = i;
}
}
public void push(String item) {
System.out.println("\npush()\n******");
if (first.item == null) {
first.item = item;
first.counter++;
} else {
System.out.println("last.item = " + last.item);
DoubleNode node = new DoubleNode(item);
first.prev = node;
node.next = first;
first = node;
}
}
public void enqueue(String item) {
System.out.println("\nenqueue()\n***********");
System.out.println("adding \"" + item + "\" to the end");
if (last.item == null) {
DoubleNode node = new DoubleNode(null); //holds null node to end list
last.item = item;
last.next = node;
} else {
DoubleNode node = new DoubleNode(null);
System.out.println("node = " + node.item); //= correct item
temp = last;
last = new DoubleNode(item); //creating a new last node
System.out.println("temp = " + temp.item); //corect
//reconnect the links
temp.next.item = last.item;
System.out.println("temp.prev = " + temp.prev.item); //correct
System.out.println("temp.next = " + temp.next.item); //correct
System.out.println("last = " + last.item); //correct
System.out.println("last.prev = " + last.prev); //correct
last.prev = temp;
System.out.println("last.prev = " + last.prev.item); //correct
last.next = node;
System.out.println("last.next = " + last.next.item); //= null to end list
System.out.println("\n\nfirst = " + first.item); //correct
System.out.println("first.next = " + first.next.item); //correct
System.out.println("first.next.next = " + first.next.next.item); //correct
System.out.println("first.next.next.next = " + first.next.next.next.item); //"null pointer exception"
}
public void printList() {
System.out.println("\nprintList():\n********");
temp = first;
int i = 0;
if (first.item == null) {
temp = first.next;
}
System.out.println("temp = " + temp.item);
while (temp.item != null) {
i++;
System.out.println(i + " " + temp.item);
temp = temp.next;
}
System.out.println();
}
解决方案
让我们看看实际发生了什么:初始状态:
- first 包含 null,first.next 是 last,last 包含 null
- push:first 不再包含 null,仍然指向 last,带有 null
- enque: last.item 为 null,所以第一个 cae 被触发,现在列表是这样的:banana -> gorilla -> null 并且 last 指向 gorilla
- 再次 enque:现在 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;
推荐阅读
- spring - 我只能通过@ComponentScan 获得另一个@Configuration
- react-native - React-Native 异步函数意外标识符 _this2
- javascript - 正则表达式 if else 语句失败
- angular - candeactivate 与子路由不工作
- python - xml用python打印元素值
- amazon-web-services - aws lightsail 连接被拒绝(在腻子中)
- javascript - 如何从struts2 Action中的multiply radio接收值
- nexmo - Nexmo:将 2 个呼叫转发到 nexmo 中的同一个 LVN
- php - PHP中未定义的索引图像,我知道这是重复但我尝试了很多解决方案但没有一个有效
- c# - 用于对集合列表进行排序的 Lambda 表达式