gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:17:17 26 4
gpt4 key购买 nike

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

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

最佳答案

问题

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

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

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

这将创建三个位于链中的节点

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

解决方案

您需要插入您已经创建的 Node,而不是调用采用 String 并创建新 Node 的 insert 方法已经创建(假设存在这样的方法):

 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

关于java - Java 中链接的插入列表(调试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29478466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com