簡體   English   中英

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") “運行時,它沒有在我要查詢的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM