首页 > 解决方案 > 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();
}

标签: javalistqueue

解决方案


让我们看看实际发生了什么:初始状态:

  • 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;

推荐阅读