在我的LinkedList中实现添加/获取时遇到问题 - Java

时间:2017-10-30 23:38:48

标签: java

我的代码有问题,而且我总是继续获取​​空指针...我正在尝试使用add and get函数创建自己的链表。

以下是我现在的代码:

public class LinkedList<E> {
private class ListNode<E> {
    public E data;
    public ListNode<E> next;
}

private ListNode<E> head;
private int size;

public LinkedList() {       
    size = 0;
}

public int size() {
    return size;
}
public void add(E e) {
    if(size == 0){ // first node in the list

        ListNode<E> firstNode = new ListNode<E>();
        firstNode.data = e;
        firstNode.next = null;

        size++; //increment size counter 
        // set this node equal to first node in the linked list
        this.head = firstNode;

    }
    else{ // not the first node
        ListNode<E> temp = head;
        while(temp != null){ // find the last node
            temp = temp.next;
        }

        // create new node to be added to linked list
        ListNode<E> newNode = new ListNode<E>();
        newNode.data = e;
        newNode.next = null;

        // set the previous last node to the new, created node
        temp = newNode;

        size++; //increment size of the LinkedList
    }
}
public E get(int index) {
    if( index > size){ // account for if user inputs something that is reachable within LinkedList
        return null;
    }
    ListNode<E> temp = head;
    if(index == 0){
        return head.data;
    }
    else{
        for(int i = 0; i < index; i++){
            temp = temp.next;
        }
        return temp.data;
    }

    }

现在在我的主要内容中,我添加一个名为num的整数LinkedList,并在其中添加数字0-9。现在当我使用函数System.out.println(num.get(1));我得到了nullExceptionError,它突出显示了我的get函数&return;返回temp.data;

我认为它必须对我的添加做一些事情,或者在没有正确指向我的节点的地方......

2 个答案:

答案 0 :(得分:2)

您的问题是您正在列表中的节点中正确更新next引用。

添加新元素时,您的目标是将linkedList中最后next的{​​{1}}字段设置为等于具有特定数据字段的新ListNode对象

但是,您尝试使用以下行添加新节点:

ListNode

由于temp是局部变量,上面的行 nothing 但在本地更新temp = newNode; 的值。

您应该更新链接列表中最后一个对象的temp字段。

您的代码看起来应该是这样的

next

答案 1 :(得分:2)

是的,它与您的添加有关。

仔细查看else方法中的add()块。您创建了一个新节点,但从未将其附加到列表的末尾:您不能在新节点上创建任何现有节点的next字段。

else{ // not the first node
    ListNode<E> temp = head;
    while(temp != null){ // you actually go one past the last node
        temp = temp.next;
    }
    // at this point temp points to null, not to the last node

    ListNode<E> newNode = new ListNode<E>();
    newNode.data = e;
    newNode.next = null;

    temp = newNode;
    // temp used to point to null, now it points to your new node,
    // but it doesn't make newNode a part of your list

    size++;
}

因此,您的列表永远不会包含多于1个元素,因为您基本上丢弃了传递给add()方法的任何内容,但第一次调用除外,您设置了head

以下一种方法可以更改此else块以便添加工作:

else{
    ListNode<E> temp = head;
    while(temp.next != null){ // find the last node (the one that has no next)
        temp = temp.next;
    }
    // now temp points to the last node in the list so far

    ListNode<E> newNode = new ListNode<E>();
    newNode.data = e;
    newNode.next = null;

    temp.next = newNode;
    // now the last node's next points to your new node,
    // so it's now a part of your list

    size++;
}