[英]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")
“運行時,它沒有在我要查詢的dynamicList中的節點“ list”之后插入“ 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);
這將創建鏈中的三個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");
時發生的情況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
的insert方法,而是需要插入已經創建的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.