我的想法是使用无序链接列表实现优先级队列。
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
。
我的工具有问题吗?有什么建议吗?
答案 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