题目描述:
给定一个无序单链表的头节点head,实现单链表的选择排序。
要求:额外空间复杂度为O(1)
思路:找到最小的节点,从原始链表上摘下来,插入到新的链表中,有两种实现,大同小异
public class Code_019_SelectionSort {
public static class Node {
public int data;
public Node next;
public Node(int data) {
this.data = data;
}
}
public static Node selectionSort1(Node head) {
if (head == null || head.next == null) {
return head;
}
Node cur = null; //当前节点
Node min = null; //最小值的节点
Node curPre = null; //当前节点的前一个节点
Node minPre = null; //最小节点的前一个节点
Node newHead = null; //排好序的链表的头节点
Node cur1 = null; //排好序链表的尾节点
while(head.next != null) {
cur = head.next;
min = head;
curPre = min;
minPre = null;
while(cur != null) {
if (cur.data < min.data) {
minPre = curPre;
min = cur;
}
curPre = cur;
cur = cur.next;
}
if (minPre == null) {
head = head.next;
} else {
minPre.next = min.next;
}
if (newHead == null) {
newHead = min;
} else {
cur1.next = min;
}
cur1 = min;
}
cur1.next = head;
return newHead;
}
public static Node selectionSort2(Node head) {
Node tail = null; //排序部分尾部
Node cur = head; //未排序部分头部
Node smallPre = null; //最小节点前一个节点
Node small = null; //最小节点
while(cur != null) {
small = cur;
smallPre = getSmallestPreNode(cur);
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 static Node getSmallestPreNode(Node head) {
Node smallPre = null;
Node small = head;
Node pre = head;
Node cur = head.next;
while(cur != null) {
if (cur.data < small.data) {
smallPre = pre;
small = cur;
}
pre = cur;
cur = cur.next;
}
return smallPre;
}
}