单链表 冒泡排序

先求长度,然后模拟冒泡排序的思想进行交换,小技巧,弄一个哨兵节点放在头结点前面,会方便很多。(链表的很多题都可以用这个小技巧来减少一些边界条件的处理)

/**
     * 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就行了,因为后面的已经排好了,不过这样也没有错,时间复杂度在数量级上也是一样的

原文地址:https://www.cnblogs.com/wmxl/p/14466915.html