2

我正在尝试将类 NumLinkedList 中的 NumList 抽象数据类型实现为单链表。

public class NumLinkedList implements NumList
{

Node head;
int nItem;

private class Node
{
    public Node next;
    public double value;
    public Node(double i, Node j)
    {
        value = i;
        next = j;

    }

}

public NumLinkedList()
{
    head = null;
    nItem = 0;

}

是我的初始化,我在使用以下方法时遇到了问题。

public void print()
{
    Node currNode = head;
    while(currNode.next != null)
    {
        currNode = currNode.next;
        System.out.println(currNode.value);
    }

}

public int size()
{
    int size = 0;
    Node currNode = head;
    while(currNode.next != null)
    {
        currNode = currNode.next;
        size++;
        nItem++;

    }
    return size;

}

public void insert(int i, double value)
{
    if( i < 0)
    {
        System.out.println("Error. out of bounds.");
    }
    if ( i > size())
    {
        Node currNode = head;
        for(int j = 0; j < i; j++)
        {
            currNode = currNode.next;
        }
        currNode.next = new Node(value,null);
    }

    if ( i <= size())
    {
        Node currNode = head;
        for(int j = 0; j < i-1; j++) // this moves CurrNode to the i-1th node
        {
            currNode = currNode.next;
        }
        currNode.next = new Node(value,currNode.next);
    }

    nItem++;
}

当我运行我的测试代码时,

public static void main (String[] args)
{
    NumLinkedList test;
    test = new NumLinkedList();

    //System.out.println("this is how many initial items the initialized list has");
    //System.out.println(test.size());
    test.insert(1, 0.1);
    System.out.println("have tried to insert value 0.1 @ position 1, that is the first element in list.");
    test.print();
    System.out.println("tried print(). did it work?");
    test.insert(4, -1);

我在

test.insert(1, 0.1);

, 指

if ( i > size())

while(currNode.next != null)

由于我也未能初始化我的数组 ADT,我相信我的列表 ADT 也被错误初始化。在谷歌上很难找到合适的例子,有没有关于 ADT 初始化的参考资料?

4

1 回答 1

1

您的问题不在于初始化,这很好,而在于方法本身。

问题是你正在初始化你的headto null,但是,无论是 inprint还是 in size,你都在做currNode = head,这也使得它null,然后循环 on currNode.next。那会在那里扔一个NullPointerException权利。您需要转到所有方法并为限制情况添加特殊代码:

对于print

if ( head == null )
    return;

对于size

if ( head == null )
    return 0;

或者,您可以简单地用一个简单的语句替换整个size方法。return nItem;

对于insert

if ( head == null )
{
    head = new Node(value,null);
    return;
}

顺便说一句,在您的 中insert,您还需要一个return在您的第一个内部if,并且您需要将您的第三个替换if为一个else.

于 2012-09-27T23:21:09.953 回答