2

I am trying to implement an abstract data type of NumList in class NumLinkedList as a singly linked list.

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;

}

is my initialization and I am having trouble with the following methods.

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

when I run my testing code,

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);

I get an error in the

test.insert(1, 0.1);

, referring to

if ( i > size())

and

while(currNode.next != null)

as I failed initializing my array ADT as well, I believe that my list ADT is also mis-initialized. It's hard to find proper examples on Google, any references for ADT initialization?

1 Answer 1

1

Your problem isn't in the initialization, which is fine, but in the methods themselves.

The problem is that you're initializing your head to null, but then, both in printand in size, you're doing currNode = head, which also makes it null, and then looping on currNode.next. That'll throw a NullPointerException right there. You need to go to all your methods and add special code for the limit case:

For print:

if ( head == null )
    return;

For size:

if ( head == null )
    return 0;

Alternatively, you can simply replace your entire size method with a simple return nItem; statement.

For insert:

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

As an aside, in your insert, you also need a return inside your first if, and you need to replace your third if with an else.

Sign up to request clarification or add additional context in comments.

2 Comments

wait I don't understand why I need a (head == null); this is the initial condition and a given, shouldn't I just check i values and ranges/limits on i values?
If head == null were a given, your list would always be empty. head == null holds right after the initialization, but only for as long as you don't set it to some other value on a correctly coded insert.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.