0

该程序应该允许用户将整数插入链接列表并保持它们始终排序。我被困在为什么在我将值返回给我的其他方法之后,此时我得到一个空指针异常。在这一点上,感觉就像我在兜圈子。我有虚拟打印语句来尝试找出问题所在。

类节点:

public class Node {
  Comparable data;
  Node next;

  Node(Node n, Comparable a) {
    this.data = a;
    this.next = n;
  }
}

类 SortedLinkedList:

public class SortedLinkedList {
  Node head = null;
  private Comparable SortedLinkedList;


  public SortedLinkedList() {
    this.head = null;
    this.SortedLinkedList = SortedLinkedList ;
  }

  public Node insert(Node head, Comparable a){
        if (head == null || (head.data.compareTo(a)> 0))
        { 
            System.out.println("In insert first if");
            head = new Node( head, a);
            //head = new Node(head, 22);
            System.out.println("Head = " + head.data + " before     return");
            return head;
        }
        Node pointer = head;
            while (pointer.next != null)
            {
                if (pointer.next.data.compareTo(a) > 0){
                    System.out.println("In insert, in while, in if");
                    break;
                }
                pointer = pointer.next;
            }
        return head;
  }

  public void print(Node head){
    System.out.println("In print outside of for" + head);
    for (Node pointer = head; pointer != null ; pointer = pointer.next)
    {
        System.out.println("In print");
        System.out.print(pointer.data);
    }
  }
}

类 TestInteger

public class TestInteger implements Comparable{
    // This is the User Interface for manipulating the List

    static SortedLinkedList sll = new SortedLinkedList ();

    public static void nodeMenu() {
        Node head = sll.head;
        System.out.println(head);
        int option;

        while(true){
            System.out.println();
            System.out.println("**** Integer Node Menu ****");
            System.out.println("****************************");
            System.out.println("** 1. Insert              **");
            System.out.println("** 2. Delete              **");
            System.out.println("** 3. Clear               **");
            System.out.println("** 4. Smallest            **");
            System.out.println("** 5. Largest             **");
            System.out.println("** 6. Return to Main Menu **");
            System.out.println("****************************");

            Scanner sc = new Scanner(System.in);
        try{

            option = sc.nextInt();
            switch (option){
            case 1:{
                try{
                    System.out.println("Type an integer to insert: ");
                    int x = sc.nextInt();
                    Integer insertItem = new Integer(x);
                    sll.insert(head, insertItem);

                    System.out.println("After insert back in case1 head = " + head.data);
                    sll.print(head);
                }catch(InputMismatchException e){
                    System.out.println("Enter only integers");
                    sc.nextLine();
                }
                nodeMenu();
            }

它在类 SortedLinkedList 中的实际插入方法中正确打印,但在类 TestInteger 中获得一个空指针。这是输出:

1
Type an integer to insert: 
5
In insert first if
Head = 5 before return
Exception in thread "main" java.lang.NullPointerException
at CS_240_HW_2.TestInteger.nodeMenu(TestInteger.java:58)
at CS_240_HW_2.Main.mainMenu(Main.java:52)
at CS_240_HW_2.Main.main(Main.java:30)
4

3 回答 3

1
head = sll.insert(head, insertItem);

代替

sll.insert(head, insertItem);

?

于 2013-05-06T21:50:47.927 回答
0

您的代码有很多需要更改的地方。例如,你只需要一个头,你只需要一个Node数据类。该类SortedLinkedList可以是一个实用程序类,它只有一些用于以特定方式欺骗节点的方法。

所以我建议更改为Node. 这个类包含所有数据,除了头部本身。

public class Node {
  Comparable data;
  Node next;

  Node(Comparable a) {
    this.data = a;
  }
}

然后对插入器类进行这些更改。这个类只是一些有用的方法,用于对链表和/或其节点做一些方便的事情。

public class SortedLinkedList {

    public Node insert(Node head, Comparable a){

        Node curr = head;
        Node prev = null;
        while (curr != null && curr.data.compareTo(a) > 0) {
            prev = curr;
            curr = curr.next;
        }
        if (prev = null) {
            return new Node(a);
        }
        prev.next = new Node(a);
        prev.next.next = curr;
        return head;
    }

    // print doesn't need changing
}

对于测试类,没有太多需要改变的东西:

public class TestInteger implements Comparable{
    // This is the User Interface for manipulating the List

    static SortedLinkedList sll = new SortedLinkedList ();
    Node head = null;

    public static void nodeMenu() {

        // no changes in this part ...

                    Integer insertItem = new Integer(x);
                    head = sll.insert(head, insertItem);
                }catch(InputMismatchException e){
                    System.out.println("Enter only integers");
                    sc.nextLine();
                }
            }

一定要取出递归调用nodeMenu()

于 2013-05-06T21:53:43.840 回答
0

您初始化一个列表:

static SortedLinkedList sll = new SortedLinkedList ();

在此构造函数中,列表的头部设置为 null:

this.head = null;

然后用列表的头部初始化一个变量:

Node head = sll.head;

head空也是如此。

然后您尝试打印 的值head.data

System.out.println("After insert back in case1 head = " + head.data);

并且由于head为空,您会得到一个 NullPointerException。

于 2013-05-06T21:54:52.777 回答