我无法弄清楚我哪里出错了,我已经检查并重新检查了我的add(int index,T obj)方法无数次,仍然得到相同的错误。这是我的代码,任何指针都会非常感激;至少现在这个问题已经持续了一天左右。
package edu.neumont.csc250;
class LinkedList<T> implements List<T>{
Node<T> head;
Node<T> tail;
int listCount;
public LinkedList(){
head = null;
listCount = 0;
}
@Override
public T get(int index) throws IllegalArgumentException {
if(index > size() - 1 || index < 0){
throw new IllegalArgumentException();
}
else{
Node<T> current = head;
for(int i = 0; i < index; i++)
{
current = current.next;
}
if(current.content != null){
return current.content;
}
else{
System.out.println("Null value.");
return null;
}
}
}
@Override
public void add(T obj) {
if(head == null){
head = new Node<T>(obj);
head.next = null;
tail = head;
listCount++;
}
else{
if(head.next == null){
head.next = new Node<T>(obj);
//head.next.next = null;
tail = head.next;
tail.prev = head;
listCount++;
}
else{
tail.next = new Node<T>(obj);
tail.next.prev = tail;
tail = tail.next;
tail.next = null;
listCount++;
}
}
}
@Override
public void add(int index, T obj) throws IllegalArgumentException {
// TODO Auto-generated method stub
Node<T> temp = new Node(obj);
Node<T> current = head;
for(int i = 0; i<=index; i++){
current = current.next;
}
temp.prev = current.prev;
current.prev = temp;
current.prev.next = current;
if(index == 0){
head = current.prev;
}
else if(index == size()+1){
tail = current.next;
}
listCount++;
}
@Override
public void replace(int index, T obj) throws IllegalArgumentException {
// TODO Auto-generated method stub
if(index > size() - 1 || index < 0){
throw new IllegalArgumentException();
}
else{
//get(index)
}
}
@Override
public T remove() {
head = head.next;
listCount--;
return null;
}
@Override
public T remove(int index) throws IllegalArgumentException {
// TODO Auto-generated method stub
if(index > size() - 1 || index < 0){
throw new IllegalArgumentException();
}
else{
listCount--;
}
return null;
}
@Override
public int size() {
return listCount;
}
public static void main(String[] args){
LinkedList<String> list = new LinkedList<String>();
list.add("Red");
list.add("Orange");
list.add("Yellow");
list.add("Green");
list.add("Blue");
list.add("Purple");
for(int a = 0; a < list.size(); a++){
System.out.println(list.get(a));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
// System.out.println(list.get(5).toString());
System.out.println("There are " + list.size() + " colors in the list.");
list.remove();
for(int b = 0; b < list.size(); b++){
System.out.println(list.get(b));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
//System.out.println(list.get(5));
System.out.println("There are " + list.size() + " colors in the list.");
list.add(0, "Red");
System.out.println(list.size());
for(int c = 0; c < list.size(); c++){
System.out.println(list.get(c));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
// System.out.println(list.get(5).toString());
System.out.println("There are " + list.size() + " colors in the list.");
}
class Node<T>{
T content;
Node<T> next;
Node<T> prev;
public Node(T content){
this.content = content;
}
public T getContents(){
return content;
}
public void printNode() {
System.out.print("{" + content + "} ");
}
}
}
如果有任何帮助,这是我的控制台读数:
红 橙子 黄色 绿色 蓝色 紫色 列表中有6种颜色。 橙子 黄色 绿色 蓝色 紫色 列表中有5种颜色。 6 红色 黄色 绿色 蓝色 紫色 线程“main”中的异常 java.lang.NullPointerException at edu.neumont.csc250.LinkedList.get(LinkedList.java:26)at edu.neumont.csc250.LinkedList.main(LinkedList.java:161)
编辑:根据要求隔离主要方法:
public static void main(String[] args){
LinkedList<String> list = new LinkedList<String>();
list.add("Red");
list.add("Orange");
list.add("Yellow");
list.add("Green");
list.add("Blue");
list.add("Purple");
for(int a = 0; a < list.size(); a++){
System.out.println(list.get(a));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
// System.out.println(list.get(5).toString());
System.out.println("There are " + list.size() + " colors in the list.");
list.remove();
for(int b = 0; b < list.size(); b++){
System.out.println(list.get(b));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
//System.out.println(list.get(5));
System.out.println("There are " + list.size() + " colors in the list.");
list.add(0, "Red");
System.out.println(list.size());
for(int c = 0; c < list.size(); c++){
System.out.println(list.get(c));
}
// System.out.println(list.get(0).toString());
// System.out.println(list.get(1).toString());
// System.out.println(list.get(2).toString());
// System.out.println(list.get(3).toString());
// System.out.println(list.get(4).toString());
// System.out.println(list.get(5).toString());
System.out.println("There are " + list.size() + " colors in the list.");
}
答案 0 :(得分:1)
当插入(add())索引为0时,新元素将插入第一个元素后面 但是,在操作完成后,头参考指向新插入的元素而不是实际的头元素 因此,当您迭代列表时会发生NPE 事实上,你可以从程序的输出中得到这个。请注意,第三次迭代从“Red”和“Orange”diappears开始。
而remove()的实现并不好,因为它会导致'内存泄漏'。它只是向前移动'头部'而不会使元素无效。