先求长度,然后模拟冒泡排序的思想进行交换,小技巧,弄一个哨兵节点放在头结点前面,会方便很多。(链表的很多题都可以用这个小技巧来减少一些边界条件的处理)
/**
* linklist冒泡排序
* @param head
* @return
* @throws InterruptedException
*/
ListNode sort(ListNode head) throws InterruptedException {
if(head == null || head.next == null) return head;
ListNode newHead = new ListNode(0), prev = newHead;
prev.next = head;
int len = 0;
ListNode now = head;
while(now != null){
len++;
now = now.next;
}
for (int i = 0; i < len; i++) {
ListNode j = newHead.next;
while(j.next != null){
if(j.val > j.next.val){
prev.next = j.next;
prev = j.next;
j.next = j.next.next;
prev.next = j;
}else{
prev = j;
j = j.next;
}
}
prev = newHead;
}
return newHead.next;
}
应该还可以优化,比如每轮循环其实不需要比较到最后每次比较到len-i就行了,因为后面的已经排好了,不过这样也没有错,时间复杂度在数量级上也是一样的