在 Java 中链接的插入列表(调试)
Insertion List Linked in Java (Debug)
我正在尝试建立一个链表,如下所示:
**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")
”运行时,它不会在节点 "list" 之后插入 "B"我构建的 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 方法 class:
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);
}
下面是我用来构造每个节点的节点class:
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;
}
}
问题
问题是你正在创建几个裸 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)
的代码,但我们可以放心地假设它会为您添加的每个 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
解决方案
不是调用采用 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
我正在尝试建立一个链表,如下所示:
**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")
”运行时,它不会在节点 "list" 之后插入 "B"我构建的 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 方法 class:
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);
}
下面是我用来构造每个节点的节点class:
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;
}
}
问题
问题是你正在创建几个裸 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)
的代码,但我们可以放心地假设它会为您添加的每个 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
解决方案
不是调用采用 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