我的代码有问题,而且我总是继续获取空指针...我正在尝试使用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;
我认为它必须对我的添加做一些事情,或者在没有正确指向我的节点的地方......
答案 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++;
}