Java中链接的插入列表(调试)

时间:2015-04-06 19:46:02

标签: java linked-list jgrasp

我正在尝试构建链接列表,如下所示:

**list-> [C] - [B] - [A] -> NULL**

这是我的主要内容:

import java.util.*; 

class LinkedListF
{
    public static void main (String [] args)
    {    
        Node aNode = new Node ("A", null);
        Node bNode = new Node ("B", aNode);
        Node list = new Node ("C",bNode);  

        DynamicList dynamicList = new DynamicList();   
        dynamicList.insertFirst("A");
        dynamicList.insertFirst("C");
        dynamicList.insertAfter(list, "B");
        //the line above is where I am struggling with.

        System.out.println(dynamicList.getList().getInfo());
        System.out.println(dynamicList.getList().getNext().getInfo());
        System.out.println(dynamicList.getList().getNext().getNext().getInfo());
    }
}

我现在遇到的问题,正如我在代码中标记的那样,是代码" dynamicList.insertAfter(list, "B")"运行,它不会插入" B"在Node" list"之后在我构造的dynamicList中。我对这里发生的事情感到非常困惑。

我的输出如下:

----jGRASP exec: java LinkedListF

C
A
Exception in thread "main" java.lang.NullPointerException
    at LinkedListF.main(LinkedListF.java:27)

 ----jGRASP wedge2: exit code for process is 1.
 ----jGRASP: operation complete.

第27行是我的第三个System.out.print语句。

下面是我的DynamicList类中的insertAfter方法:

public void insertAfter(Node p, String x)
{
    if (isEmpty())
    {
        System.out.println("VOID INSERTION.");
        System.exit(1);
    }

    Node q = new Node (x, p.getNext());
    p.setNext(q);
}

下面是我用来构造每个节点的Node类:

class Node
{
    private String data;
    private Node next;

    public Node (String data, Node next)
    {
        this.data = data;
        this.next = next;
    }

    String getInfo()
    {
        return data;
    }

    Node getNext()
    {
        return next;
    }

    void setInfo(String data)
    {
        this.data = data;
    }

    void setNext(Node next)
    {
        this.next = next;
    }
}

1 个答案:

答案 0 :(得分:1)

问题

问题是你正在创建几个不属于Node的裸dynamicList个对象,所以你的列表比你想象的要短,而且你的打印语句都在运行结束

让我们看看您的代码实际在做什么:

 Node aNode = new Node ("A", null);
 Node bNode = new Node ("B", aNode);
 Node list = new Node ("C", bNode);  

这将创建链中的三个Node

list -> bNode -> aNode -> null

然后,您创建一个DynamicList并向其中添加几个String

 DynamicList dynamicList = new DynamicList();   
 dynamicList.insertFirst("A");
 dynamicList.insertFirst("C");

您还没有显示insertFirst(String)的代码,但我们可以放心地为您添加的每个Node创建一个新的String,这样您就可以了:

(stand-alone)  list -> bNode -> aNode -> null
(dynamicList)  "C" -> "A" -> null

现在让我们来看看dynamicList.insertAfter(list, "B");

时会发生什么

首先,该方法检查列表是否为空(它不是,因为您已添加" A"以及" C"它) 。但是,它会根据您提供的Node创建新的String,并在参数 Node后插入。它无处检查以查看Node中是否存在DynamicList

这意味着你最终得到了这个:

(stand-alone)  list -> "B" -> bNode -> aNode -> null
(dynamicList)  "C" -> "A" -> null

当您尝试打印时,这是导致NPE的原因:

System.out.println(dynamicList.getList().getInfo());
(dynamicList)  "C" -> "A" -> null
               ^^^                  prints "C"

System.out.println(dynamicList.getList().getNext().getInfo());
(dynamicList)  "C" -> "A" -> null
                      ^^^           prints "A"

System.out.println(dynamicList.getList().getNext().getNext().getInfo());
(dynamicList)  "C" -> "A" -> null
                             ^^^    null has no info to get

解决方案

您需要插入已经创建的String(假设存在此类方法),而不是调用带有Node并创建新Node的插入方法。 ):

 Node aNode = new Node ("A", null);
 Node list = new Node ("C", aNode);
 // creates list ("C") -> aNode ("A") -> null

 DynamicList dynamicList = new DynamicList();
 dynamicList.insertFirst(list);
 // dynamicList = list ("C") -> aNode ("A") -> null
 dynamicList.insertAfter(list, "B");
 // dynamicList = list ("C") -> "B" -> aNode ("A") -> null

更简单的解决方案是永远不要手动创建任何Node,让DynamicList完成所有工作:

 DynamicList dynamicList = new DynamicList();
 dynamicList.insertFirst("A");
 dynamicList.insertFirst("B");
 dynamicList.insertFirst("C");
 // dynamicList = "C" -> "B" -> "A" -> null