我需要一些帮助来清除在Java中排序Priority Queue +链表的问题

时间:2010-09-26 11:50:25

标签: java linked-list priority-queue

您好 我试图从头开始使用链表实现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));

2 个答案:

答案 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循环之后您不再使用此引用