在Java中,使用链表进行合并排序会引发一个奇怪的错误
我已经检查了所有的推、弹出和偷看方法,它们工作正常。我曾尝试在Eclipse中调试这段代码,在divide()上设置断点后,它直接指向“private Node next;”行在类节点中。我认为这是因为divide中的参数是类节点的参数。代码如下:在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
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,我如果你尝试访问它,你可以提供主要的方法吗?