对链表进行插入排序,插入排序的基本思想是对链表分为两个部分,前半部分为已经排序部分,后半部分为未排序部分。每次插入过程取未排序部分的第一个元素作为待排序元素,然后遍历已排序部分的元素,找到第一个比待排序元素大的元素,将待排序元素插入到该元素前面,至此完成了一次插入排序操作。
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null || head.next == null)return head;
ListNode dummy = new ListNode(-1);
ListNode pre;
dummy.next = head;
while(head!= null && head.next != null){
//如果head.next指向待排序元素,如果head的值小于等于head.next的值,说明这两个数已经排好序,继续向下遍历
if(head.val<=head.next.val){
head = head.next;
continue;
}
//每次都从链表头开始遍历已排序部分
pre = dummy;
//在已排序部分找到比当前节点大的节点
while(pre.next.val < head.next.val)pre = pre.next;
//cur节点表示待排序节点
ListNode cur = head.next;
//head节点后移,
head.next = cur.next;
//将cur插入到第一个比cur大的节点前面
cur.next = pre.next;
pre.next = cur;
}
return dummy.next;
}
}