无法使双向链表工作

时间:2011-08-10 04:44:58

标签: java

所以我的家庭作业是: (双链接列表)实现包含整数值的双向链表。使用值[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;
   }
}

1 个答案:

答案 0 :(得分:3)

我通常甚至不会阅读有关家庭作业的问题,主要是因为问题是“如何实施......”。但是做了例外,我认为你的努力值得一些暗示。

查看“count”成员字段。你有一些函数依赖于它是正确的,你的一个函数正在破坏它。