在Java中,使用链表进行合并排序会引发一个奇怪的错误

在Java中,使用链表进行合并排序会引发一个奇怪的错误,java,eclipse,debugging,linked-list,Java,Eclipse,Debugging,Linked List,我已经检查了所有的推、弹出和偷看方法,它们工作正常。我曾尝试在Eclipse中调试这段代码,在divide()上设置断点后,它直接指向“private Node next;”行在类节点中。我认为这是因为divide中的参数是类节点的参数。代码如下: import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class mergeSort { Scanner s

我已经检查了所有的推、弹出和偷看方法,它们工作正常。我曾尝试在Eclipse中调试这段代码,在divide()上设置断点后,它直接指向“private Node next;”行在类节点中。我认为这是因为divide中的参数是类节点的参数。代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class mergeSort {

    Scanner scanner;
    Node firstNode = null;
    Node lastNode = null;
    Node currentNode = null;
    int size = 0;

    public mergeSort(String fileName) throws FileNotFoundException{
        scanner = new Scanner(new File(fileName));
        while(scanner.hasNextInt()){
            push(scanner.nextInt());
        }
    }

    public void divide(Node tempFirstNode, Node tempLastNode, int tempSize){
        if(tempFirstNode != tempLastNode){
            Node midNode = tempFirstNode;
            for(int i = 0; i < (tempSize/2-1); i++){
                midNode = tempFirstNode.next;
            }
            divide(tempFirstNode, midNode, tempSize/2);
            divide(midNode.next, tempLastNode, tempSize-tempSize/2);
            merge(tempFirstNode, tempLastNode, midNode);
        }       
    }

    public void merge(Node firstNode, Node lastNode, Node midNode){
        Node leftHead = firstNode;
        Node rightHead = midNode.next;
        Node rightTail = lastNode;

        while(leftHead != rightHead && rightHead != rightTail.next){
            if(leftHead.data <= rightHead.data){
                if(currentNode != null){
                    currentNode.next = leftHead;
                    currentNode = leftHead;
                    leftHead = leftHead.next;
                }
                else{
                    currentNode = leftHead;
                    leftHead = leftHead.next;
                }
            }
            else{
                if(currentNode != null){
                    currentNode.next = rightHead;
                    currentNode = rightHead;
                    rightHead = rightHead.next;
                }
                else{
                    currentNode = rightHead;
                    rightHead = rightHead.next;
                }
            }
        }
    }

    public void push(int newEntry) {
        Node newNode = new Node(newEntry, firstNode);
        if(lastNode == null)
            lastNode = newNode;
        firstNode = newNode;
        size++;
    }

    public int pop(){
        int top = peek();
        if(firstNode != null)
            firstNode = firstNode.next;
        size--;
        return top;
    }

    public int peek() {
        if(firstNode != null)
            return firstNode.data;
        return (Integer) null;
    }

    class Node{

        private int data;
        private Node next;

        public Node(int newData, Node nextNode){
            data = newData;
            next = nextNode;
        }
    }
}
导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.Scanner;
公共类合并排序{
扫描仪;
Node firstNode=null;
Node lastNode=null;
节点currentNode=null;
int size=0;
公共合并排序(字符串文件名)引发FileNotFoundException{
扫描仪=新扫描仪(新文件(文件名));
while(scanner.hasNextInt()){
推(scanner.nextInt());
}
}
public void divide(节点tempFirstNode、节点tempLastNode、int tempSize){
if(tempFirstNode!=tempLastNode){
Node midNode=tempFirstNode;
对于(int i=0;i<(tempSize/2-1);i++){
midNode=tempFirstNode.next;
}
分割(tempFirstNode、midNode、tempSize/2);
除法(midNode.next,tempLastNode,tempSize-tempSize/2);
合并(tempFirstNode、tempLastNode、midNode);
}       
}
公共无效合并(节点firstNode、节点lastNode、节点midNode){
节点leftHead=firstNode;
Node rightHead=midNode.next;
Node rightail=lastNode;
while(leftHead!=righhead&&righhead!=rightail.next){

如果(leftHead.data奇怪的错误在哪里?很难发现这种学生代码。mergesort构造函数中对Scanner的严格依赖,你怎么知道?它是“private Node next”中的NullPointerException;我很确定,你忘了设置列表中最后一个节点的值。如果它为null,将出现NullPointerException,我如果你尝试访问它,你可以提供主要的方法吗?