所以我的家庭作业是: (双链接列表)实现包含整数值的双向链表。使用值[11,22,77,44,55,66,33]填充列表。显示列表的内容。写一个方法将值分成奇数,甚至更晚。在我们的例子中,重新排序的列表应该是:[11,77,55,33,22,44,66]。
我可以让它工作,并为最多6个数字做它应该做的事情,但是将第7个数字添加到错误中。
Exception in thread "main" java.lang.NullPointerException
at MyList.sortData(MyList.java:100)
at Driver.main(Driver.java:24)
public class Driver {
/**
* @param args
*/
public static void main(String[] args) {
MyList<Integer> list = new MyList<Integer>();
list.add(11);
list.add(22);
list.add(77);
list.add(44);
list.add(55);
list.add(66);
list.add(33);
System.out.println("<<Original Data>>");
list.showData();
System.out.println();
System.out.println("<<Sorted Data>>");
list.sortData(list);
list.showData();
}
}
public class MyList<E>{
private Node<E> head;
private Node<E> tail;
int count;
public MyList(){
head = null;
tail = null;
count = 0;
}
public Node<E> add(E newData){
Node<E> current = new Node<E>(newData);
// case 1: list is empty
if (count == 0){
count ++;
head = current;
tail = current;
return current;
}
// case 2: list is not empty
if (count > 0){
count ++;
tail.setNext(current);
current.setPrior(tail);
tail = current;
return current;
}
return null;
}
public Node<E> removeFirst(){
Node<E> firstNode = head;
if (head == tail){
count = 0;
head = tail = null;
return firstNode;
}
else{
head = firstNode.getNext();
count --;
return firstNode;
}
}
public Node<E> removeLast(){
Node<E> lastNode = tail;
Node<E> current = head;
if (head == tail){
count = 0;
head = tail = null;
return lastNode;
}
else{
count --;
tail = tail.getPrior();
tail.setNext(null);
return lastNode;
}
}
public Node<E> removeAt(int index){
Node<E> current = head;
Node<E> next = null;
Node<E> prior = null;
if (index > count) return null;
if (index == 0) return removeFirst();
if (index == count -1) return removeLast();
else{
for(int i = 0; i < index; i++){
current = current.getNext();
}
next = current.getNext();
prior = current.getPrior();
prior.setNext(next);
next.setPrior(prior);
count--;
return next;
}
}
public void sortData(MyList<Integer> list){
Node<E> current = head;
int key = 0;
while(count > 0){
Node<E> data = current;
if((Integer)current.getData() % 2 == 0){
current = (Node<E>) list.removeAt(key);
list.add((Integer)data.getData());
}
else{
key++;
current = current.getNext();
}
count--;
}
}
public void showData(){
Node<E> current = head;
System.out.print("[");
while(current != null){
System.out.println(current.showData());
current = current.getNext();
}
System.out.print("]");
}
}
public class Node<E> implements Comparable<E>{
private E data;
private Node<E> next;
private Node<E> prior;
public Node(E newElement){
data = newElement;
next = null;
prior = null;
}
public Node<E> getPrior() {
return prior;
}
public void setPrior(Node<E> prior) {
this.prior = prior;
}
public E getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
public String showData(){
String result = " " + data +" ";
return result;
}
@Override
public int compareTo(E otherData) {
String thisData = (String) data;
if (thisData.compareTo((String)otherData) == 0)
return 0;
else if (thisData.compareTo((String)otherData) < 0)
return -1;
else
return 1;
}
}
答案 0 :(得分:3)
我通常甚至不会阅读有关家庭作业的问题,主要是因为问题是“如何实施......”。但是做了例外,我认为你的努力值得一些暗示。
查看“count”成员字段。你有一些函数依赖于它是正确的,你的一个函数正在破坏它。