【发布时间】:2018-01-21 19:00:59
【问题描述】:
public class SortList{
class ListNode{
ListNode next;
int val;
public ListNode(int val){
this.val = val;
}
}
public static ListNode sortList(ListNode head) {
if(head == null)
return null;
PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>( (a,b) -> (a.val - b.val));
while(head != null){
pq.add(head);
head = head.next;
}
ListNode pointer = pq.poll();
ListNode result = pointer;
while(pq.size() >0 ){
System.out.println(pq.size());
ListNode nextTemp = pq.poll();
pointer.next = nextTemp;
pointer = pointer.next;
}
return result;
}
public static void main(String[] args){
ListNode head = new ListNode(3);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(5);
ListNode n4 = new ListNode(9);
ListNode n5 = new ListNode(7);
ListNode n6 = new ListNode(4);
head.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = null;
ListNode result = sortList(head);
while(result != null){
System.out.println(result.val);
result = result.next;
}
}
}
我想使用优先级队列对链表进行排序,但是为什么在 poll() 直到队列为空时会出现无限循环?列表大小减小但增加,优先级队列永远不会为空。
输出:
6
5
4
3
2
1
1
2
3
4
6
7
9
2
3
4
6
7
9
2
3
4
6
7
9
2
3
4
6
7
9
2
3
4
6
.......无限循环
【问题讨论】:
-
欢迎来到 StackOverflow。请阅读有关如何提问的帮助,尤其是有关提供Minimum Complete Verifiable Example 的部分。
-
@manchiu 你可以为我们发布整个代码吗?这对我来说很容易,因为我不必为 ListNode 和 main 方法编写代码。谢谢
-
能否也提供程序的错误或输出?
-
与您的直接问题无关,但您的比较中有一个严重的错误。见blog.mischel.com/2016/11/21/…
-
pq.size()的输出是否显示项目数量正在减少?它会变为 0 然后停留在那里,还是只是给你随机值?根据您显示的代码,您描述的行为似乎是不可能的。但是,您确实有一个错误:您添加到结果列表的最后一个节点将指向它在进入队列之前指向的任何内容。返回前需要设置pointer.next = null。
标签: java algorithm linked-list priority-queue