栈和队列----单链表的选择排序

单链表的选择排序

  

  给定一个无序单链表的头节点 head,实现单链表的选择排序,要求额外空间复杂度是 O(1)

  

  【解析】

  要求额外空间复杂度是 O(1),所以不能使用数组等容器进行排序,直接使用几个变量

  选择排序是在从未排序部分选择最小值,然后放在排序部分的尾部,逐渐将未排序部分缩小,最后变成排好序的部分。

 

package com.test;

import com.test.ListNode;

/**
 * Created by Demrystv.
 */
public class SelectionSortOfListNode {

    /*
    1. 开始时默认整个链表都是未排序的部分,对于找到的第一个最小值节点,肯定是整个链表的最小节点,将其设置为newHead
    2. 每次在未排序部分中找到最小值的节点,然后把这个节点从未排序的链表中删除,删除某个节点一定要找到这个节点的前一个节点
    3. 把删除的节点(也就是每次的最小值节点)连接到排好序部分的链表尾部。
    4. 全部过程处理完毕后,整个链表都已经有序,返回newHead
     */
    public ListNode selectionSort(ListNode head){
        ListNode tail = null; //已排序部分的尾部
        ListNode cur = head;  // 为排序部分的头部
        ListNode smallPre = null; //最小节点的头一个节点
        ListNode small = null; // 最小节点

        while (cur != null){
            small = cur;
            smallPre = getSmallPre(head);
            if (smallPre != null){
                small = smallPre.next;
                smallPre.next = small.next;
            }
            cur = cur == small ? cur.next : cur;
            if (tail == null){
                head = small;
            }else {
                tail.next = small;
            }
            tail = small;
        }
        return head;
    }

    public ListNode getSmallPre(ListNode head){
        ListNode smallPre = null;
        ListNode small = head;
        ListNode pre = head;
        ListNode cur = head.next;

        while (cur != null){
            if (cur.val < small.val){
                small = cur;
                smallPre = pre;
            }
            pre = cur;
            cur = cur.next;
        }
        return smallPre;
    }

}

 

posted @ 2018-07-25 09:39  Demrystv  阅读(181)  评论(0编辑  收藏  举报