题目
给定一个无序单链表头节点head,实现单链表的选择排序
要求:额外空间复杂度为O(1),时间复杂度O()
思路
选择排序是从未排序的部分中找到最小值,然后放在排好序部分的尾部。
- 开始整个链表都是未排序部分,找都整个链表的最小值点即为新的头节点
- 在未排序的部分中找到最小值的节点,然后在未排序部分删除这个节点,并连接到排好序部分的队尾
- 返回头节点
源码
public static class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public static Node selectionSort(Node head){
Node tail=null;//排序部份尾部
Node cur=head;//未排序部分头部
Node smallPre=null;//最小节点的前一个节点
Node small=null;//最小的节点
while(cur!=null){
small=cur;
smallPre=getSmallestPreNode(cur);
//当头节点是最小节点时,smallPre为空
if(smallPre!=null){
small=smallPre.next;
smallPre.next=small.next;
}
//cur为未排序部分的头节点,如果当前cur为最小值
//则cur要往后继续走一步,否则不变
cur=cur==small?cur.next:cur;
//将最小值节点赋值为新的头节点
if(tail==null){
head=small;
}else{
tail.next=small;
}
tail=small;
}
return head;
}
//返回未排序部分的最小值节点的前一个节点
public Node getSmallestPreNode(Node head){
Node smallPre=null;
Node small=head;
Node pre=head;
Node cur=head.next;
while(cur!=null){
if(cur.value<small.value){
small=cur;
smallPre=pre;
}
pre=cur;
cur=cur.next;
}
return smallPre;
}