单链表的选择排序
给定一个无序单链表的头节点 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; } }