调试链表实现

时间:2013-09-22 02:28:15

标签: java linked-list

DList.java包含了这些方法,我们给出了前4种方法,最后4种方法我们不得不自己写,坦率地说,我刚刚把自己弄糊涂了。我在运行程序时遇到了这个错误

Exception in thread "main" java.lang.NullPointerException
    at javaapplication13.DList.remove(Dlist.java:41)
    at javaapplication13.Driver.main(Driver.java:18)
Java Result: 1

我知道这个错误是什么,但我觉得我最后实现了错误的方法而我的教授并没有直接通过实例。

DList./java,这些是方法

package javaapplication13;

import java.util.NoSuchElementException;

/**
 *
 * @author thomas
 */
class DList<E> {
    public DLink<E>  head , tail , curr ;
    private  int  cnt ;



  /**
     * Insert "it" at current position
     */
    public void insert(E it) {
        curr.setNext(new DLink<E>(it, curr, curr.next()));
        curr.next().next().setPrev(curr.next());
        cnt++;
    }

    /**
     * Append "it" to list
     */
    public void append(E it) {
        tail.setPrev(new DLink<E>(it, tail.prev(), tail));
        tail.prev().prev().setNext(tail.prev());
        cnt++;
    }

    /**
     * Remove and return current element
     */
    public E remove() {
        if (curr.next() == tail) {
            return null; // Nothing to remove
        }
        E it = curr.next().element(); // Remember value
        curr.next().next().setPrev(curr);
        curr.setNext(curr.next().next()); // Remove from list
        cnt--; // Decrement the count
        return it; // Return value removed

    }
 public void moveToPrev() {
        if (curr != head) // Can’t back up from list head
        {
            curr = curr.prev();
        }
    }

 public void moveToPos(int pos)
 {
     assert (pos>=0) && (pos<=cnt) : "Position out of range";
  curr = head;
  for(int i=0; i<pos; i++) {curr = curr.next();
 }}

 public void moveToValue(E it)
 {
while (it!=curr)
{

}
  }
   public  void insertBefore(E it) {
   curr.setNext(new DLink<E>(it, curr, curr.prev()));
        curr.next().prev().setPrev(curr.next());
        cnt++;

  }

 public void removePrev()
 {
moveToPrev();
 if (curr==null) {
      throw new IndexOutOfBoundsException("empty list.");
    }
    if (curr == head) {
      throw new NoSuchElementException("cannot remove the head");
    }
    remove();

  }

 public void printAll()
 {


        while(curr != null){
            System.out.print(curr +" ");
            curr = curr.next;
        }
        System.out.println();          
             }
}

DLink.java,这也给了我们。

package javaapplication13;

/**
 * Doubly linked list node
 */
class DLink<E> {

  public E element; // Value for this node
public DLink<E> next, prev; // Pointer to next node in list
 // Pointer to previous node

    /**
     * Constructors
     */

    /** Constructors */
DLink(E it, DLink<E> p, DLink<E> n)
{ element = it; prev = p; next = n; }
DLink(DLink<E> p, DLink<E> n) { prev = p; next = n; }
/** Get and set methods for the data members */
DLink<E> next() { return next; }
DLink<E> setNext(DLink<E> nextval)
{ return next = nextval; }
DLink<E> prev() { return prev; }
DLink<E> setPrev(DLink<E> prevval)
{ return prev = prevval; }
E element() { return element; }
E setElement(E it) { return element = it; }


}

Driver.java,这是教师用

测试提供的文件
public class Driver{

public static void main(String args[])
{
    DList<Integer> dlList = new DList<Integer>();

    System.out.println("removing from empty list");
    dlList.remove();
    dlList.remove();

    dlList.insert(30);
    dlList.insert(20);
    dlList.insert(10);

    dlList.append(40);
        dlList.append(50);
        dlList.append(60);

    dlList.printAll();

    System.out.println("Moving to Position 3..");
    dlList.moveToPos(3);

    dlList.append(200);

    dlList.insert(180);
    dlList.insert(140);
    dlList.insert(120);

    System.out.println("Moving to Previous Position..");
    dlList.moveToPrev();

    dlList.printAll();

    System.out.println("Removing node..");
    dlList.remove();

    dlList.printAll();

    System.out.println("Moving to First Position..");
    dlList.moveToStart();

    System.out.println("Removing node..");
    dlList.remove();

    dlList.printAll();

    System.out.println("Moving to Value 2..");
    dlList.moveToValue(2);

    System.out.println("Moving to Value 120..");
        dlList.moveToValue(120);

    System.out.println("Inserting 25..");
    dlList.insert(25);
        dlList.printAll();

    System.out.println("Removing previous node..");
        dlList.removePrev();
        dlList.printAll();

    System.out.println("Moving to First Position..");
    dlList.moveToStart();

    System.out.println("Inserting 45..");
        dlList.insert(45);

    System.out.println("Insert before 35..");
    dlList.insertPrev(35);
        dlList.printAll();

    System.out.println("Moving to 50..");
        dlList.moveToValue(50);

    System.out.println("Inserting 55..");
        dlList.insert(55);
    dlList.printAll();

    System.out.println("Removing previous nodes twice.");
    dlList.removePrev();
        dlList.removePrev();
        dlList.printAll();

    System.out.println("Removing nodes thrice.");
        dlList.remove();
    dlList.printAll();
    dlList.remove();
        dlList.printAll();
        dlList.remove();

        dlList.printAll();

}
}

1 个答案:

答案 0 :(得分:0)

curr.next()为空。你没有初始化它。因此,调用其中的下一个方法将给出NullPointerException