如何使用无序链表实现优先级队列

时间:2016-09-17 03:12:01

标签: java algorithm priority-queue

我的想法是使用无序链接列表实现优先级队列。

    public class UnorderedLinkedListMaxPQ<Key extends Comparable<Key>> {
    private Node first;
    private int n;                                        //number of elements
    private class Node{
        Key key;                                          //elements
       Node next;   
    }

    public boolean isEmpty()               {return first==null;}
    public int size()                      {return n;}
    public void insert(Key key){
        Node oldfirst=first;
        first=new Node();
        first.key=key;
        first.next=oldfirst;
        n++;
    }

    public Key delMax(){
        Node node=first;
        if(node==null) {return null;}
        Key max=node.key;
        while(node.next!=null){
            Key data=node.next.key;
            if(data.compareTo(max)>0){
                max=data;
            }
            node=node.next;
        }
         first=first.next;
          n--;
        return max;
    }

    //Test Routine
    public static void main(String[] args) {
        UnorderedLInkedListMaxPQ<String> pq=new UnorderedLInkedListMaxPQ<String>();
        pq.insert("this");
        pq.insert("is");
        pq.insert("a");
        pq.insert("test");

        for(int j=0;j<pq.n;j++){
            StdOut.print(pq.delMax());
            StdOut.println();

        }
    }
}

我搜索链表中的max元素,然后返回maxest元素。 但是当我测试时,输出为this this,我认为是this test is a

我的工具有问题吗?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

性能方面,这不是实现优先级队列的最佳方法。我建议在插入时保留一个有序列表。通过这种方式,您只需删除第一个以检索最大值而不扫描整个链表。

但是如果你想坚持当前的方法,修改delMax(),如下所示:

public Key delMax(){

    if(first==null) 
        return null;
    else if(n==1)
        return first.key;
    Node max=first,maxPrev=null,curr = max.next,prev = first;
    while(curr!=null){
        Key currMax = max.key;
        Key nextKey = curr.key;
        if(nextKey.compareTo(currMax)>0){
            max = curr;
            maxPrev = prev;
        }
        prev = curr;
        curr = curr.next;
    }
    if(maxPrev!=null)
        maxPrev.next=max.next;
    else
        first = max.next;
    n--;
    return max.key;
}

同时修改以下内容:

int k = pq.n;
for(int j=0;j<k;j++){
    StdOut.print(pq.delMax());
    StdOut.println();
}

这应该返回您想要的this test is a

输出