我想写一个PriorityList队列,其中所有Elements都是订单的基础。在我的情况下,我想订购Type ElementType的元素(可以是任何东西,用于测试我使用整数并根据它们的值对它们进行排序,从最高值开始并以最低值结束)
但是,我在以下方法中找到错误时感到很茫然。代码运行但不按预期工作。
让代码添加3 3 4或3 4 5很好地工作。我得到4 3 3和5 4 3,完全应该如此。 但是,如果我给队列提供以下值:5 3 3 4 5 4,我得到:5 3 3; 我希望5 5 4 4 3 3; 我认为这是可以理解的,有什么不对,但是我并不完全理解指针以解决这个问题。
如果有人可以查看以下代码行并尝试弄清楚,出了什么问题以及如何修复它,我会非常高兴。如有必要,我可以在第二天早上提供更多信息。
public void enqueue(ElementType element) {
ListNode elem = new ListNode ((ElementType)element);
if(head == null) {
head = elem;
head.data = element;
head.next = null;
head.prev = null;
tail = head;
}
else {
ListNode n = null;
n = head;
if(element.compareTo(head.data) > 0) {
elem.prev = null;
head.prev = elem;
elem.next = head;
head.next = n.next;
head = elem; return;
}
int k = 0;
while(element.compareTo(n.data) <= 0 ) {
k++;
if(n.next !=null) {
n = n.next;
}
else {
elem.prev = n;
n.next = elem;
tail = elem;
elem.next = null;
return; }
}
elem.prev = n.prev;
n.prev = elem;
elem.next = n;
} }
答案 0 :(得分:1)
我相信PriorityQueue
可以取代你的大部分代码。查看the JavaDocs。
优先级队列的元素按其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。
因此,如果ElementType
实施Comparable<ElementType>
,或者如果您提供Comparator<ElementType>
,则应该全部设置。
答案 1 :(得分:0)
正如wasgren指出的那样,这个代码在PriorityQueue中是多余的。也许您正在这样做以了解链接列表,但是......
此代码无法正常工作,因为您在上一个案例中没有正确链接elem
(在第二个最后一个大括号之前的代码块)。
尝试将其添加到该块的末尾,就在那些紧密的大括号之前:
elem.prev.next = elem;
答案 2 :(得分:-1)
为什么不使用java优先级队列来完成大部分工作,并且非常优化你所拥有的