【问题标题】:Insertion List Linked in Java (Debug)Java中链接的插入列表(调试)
【发布时间】:2015-04-06 19:46:01
【问题描述】:

我正在尝试构建如下所示的链表:

**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”。我对这里发生的事情感到非常困惑。

我的输出如下所示:

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

【问题讨论】:

  • “LinkedListF.main(LinkedListF.java:27) 处的 java.lang.NullPointerException”。第 27 行是什么?
  • @Thilo “第 27 行是我的第三个 System.out.print 语句。”
  • 你明白list 永远不会被添加到dynamicList,对吧?
  • listinsertFirst("C")创建的节点有区别
  • @m0skit0 他在list 之后添加了一个新的“B”节点,但是list 从未添加到dynamicListinsertAfter() 方法只添加到传递给它的 Node,而不添加到 DynamicList 中已经存在的任何节点。他自己创建了list->"B"->bNode->aNodedynamicList 仅由 "C"->"A" 组成。

标签: java linked-list jgrasp


【解决方案1】:

问题

问题是您正在创建几个裸Node 对象,它们不属于dynamicList,因此您的列表比您想象的要短,并且您的打印语句即将结束。

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

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

这将创建三个Nodes,它们在一个链中

list -> bNode -> aNode -> null

然后您创建一个DynamicList 并向其中添加一对Strings:

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

您尚未显示 insertFirst(String) 的代码,但我们可以放心地假设它会为您添加的每个 String 创建一个新的 Node,这样您就可以:

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

现在让我们看看当你dynamicList.insertAfter(list, "B");时会发生什么

首先,该方法检查列表是否为空(它不是空的,因为您在其中添加了“A”和“C”)。但是,它会根据您给它的String 创建一个新的Node,并将其插入在参数之后 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

解决方案

您需要插入您已经创建的Nodes(假设存在此类方法),而不是调用采用String 并创建新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

【讨论】:

  • 您好 azurefrog,感谢您的回答!我尝试了您提到的第二个解决方案,它奏效了!我使用“insertAfter”方法是因为我想确保这个方法也有效。
  • 你好 azurefrog,我按照你的建议创建了一个“insertMethod (Node x)”。该方法将节点作为参数。这就是我所拥有的:dynamicList.insertFirst(list); dynamicList.insertAfter(list,"A"); dynamicList.insertAfter(list, "B");这是工作。是不是因为现在当我运行 'insertAfter(list, "A") 时,Java 知道动态列表中存在节点“列表”,所以列表与动态列表相关?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多