您好 我试图从头开始使用链表实现Java中的优先级队列,但我在插入时排序元素时遇到问题。到目前为止,这是我的计划,任何帮助都将受到大力赞赏。
import java.util.Scanner;
public class T0 {
public static void main(String args[]) {
Scanner keyboard = new Scanner(System.in);
PQ myList = new PQ();
myList.addSort("Z");
myList.addSort("B");
myList.addSort("C");
myList.addSort("B");
myList.addSort("Z");
System.out.println(myList.view(0));
System.out.println(myList.view(1));
System.out.println(myList.view(2));
System.out.println(myList.view(3));
System.out.println(myList.view(4));
}
}
class PQ {
Node tail = new Node(null, null);
int elementCount = 0;
Node lastAdded = tail;
public void add(String word) {
Node added = new Node(word, lastAdded);
lastAdded=added;
elementCount++;
}
public void addSort(String word){
Node temp = new Node(null, null);
for(int n = 0; n<elementCount && word.compareTo(lastAdded.next().toString()) >1; n++){
temp=lastAdded.next();
}
Node added = new Node(word, lastAdded.next());
lastAdded.changeNext(added);
elementCount++;
}
public String view(int i){
Node temp = lastAdded;
for(int n = elementCount; n > i; n--){
temp=temp.next();
}
return temp.toString();
}
public String toString() {
return lastAdded.toString();
}
class Node {
String name;
Node nextNode;
public Node(String s, Node n) {
name = s;
nextNode = n;
}
public void changeNext(Node n){
nextNode=n;
}
public Node next() {
return nextNode;
}
public String toString() {
return name;
}
}
}
目前输出:
run:
Z
B
C
B
Z
BUILD SUCCESSFUL (total time: 1 second)
Upadate: 将addSort更改为:
public void addSort(String word){
Node temp = lastAdded;
for(int n = 0; n<elementCount && word.compareTo(lastAdded.next().toString()) > 0; n++){
temp=lastAdded.next();
}
Node added = new Node(word, lastAdded.next());
lastAdded.changeNext(added);
elementCount++;
lastAdded=temp;
}
这会在
处抛出空指针异常System.out.println(myList.view(0));
答案 0 :(得分:1)
在循环中
for(int n = 0; n<elementCount && word.compareTo(lastAdded.next().toString()) >1; n++){
temp=lastAdded.next();
}
你总是将新单词与同一个元素进行比较,而不是遍历列表(1a)(并且你继续在循环中分配temp
相同的值(1b)中)。 [更新] 您将compareTo
的输出与1进行比较,而不是0 (2)。因此 - 取决于compareTo
的实现 - 结果可能总是为假。 (AFAIK特别不适用于String.compareTo
,因为它可以返回大于1的值 - 但这一般不能保证。) [/ Update]
然后,无论检查结果如何,您总是在最后添加的元素(3)之后添加新元素。
但是,由于您未调整lastAdded
(4),因此它将继续指向同一元素(tail
),因此实际上{{1}将始终是列表中的第一个项,而不是 last 。
tail
中的更新2:,修复了上述问题(2)和(4),但(1a-b)和(3)仍然存在。
部分问题是,要使单个链接列表起作用,您需要始终保持对其 head 的引用 - 否则您无法完成它!你有点试图使用addSort
来实现这个目的,但这只是混合了两个不同的东西,造成了进一步的混乱。请注意,实际上并不需要对最后添加的节点的引用 - 当您要将下一个元素插入列表时,此信息无用。我建议在图片中加入专用的lastAdded
引用,并相应地更改代码(并删除head
,除非您确定以后需要它)。请注意,这并不能消除(4)的需要 - 即使您只有lastAdded
引用,您仍然需要修改它(尽管并非总是如此 - 只有在列表的开头插入时)。
答案 1 :(得分:0)
在addSort
方法中,您要为要插入节点的位置分配Node temp
(但似乎是) - 但是在for循环之后您不再使用此引用