我无法弄清楚我哪里出错了,我已经检查并重新检查了我的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种颜色 . 在edu.neumont.csc250.LinkedList.main(LinkedList.java:161)的edu.neumont.csc250.LinkedList.get(LinkedList.java:26)中的线程“main”java.lang.NullPointerException中有6个红色黄色绿色蓝色紫色异常)
编辑:按要求隔离主要方法:
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.");
}
1 回答
当插入(add())索引为0时,新元素将插入第一个元素后面 .
但是,头部参考指向新插入的元素而不是操作完成后的实际头部元素 .
因此,迭代列表时会发生NPE .
事实上,你可以从程序的输出中得到这个 . 请注意,第三次迭代从'Red'和'Orange' diappears开始 .
并且remove()的实现并不好,因为它'll lead to ' Memory Leak '. It just moves the ' head'forward without nulling the element .