Sort a linked list using insertion sort.



把插入排序应用在linkedlist上面,做一点小小的变动,之前查找到需要改变位置的元素的时候从后往前一步一步挪,因为是singlelinkedlist,则需要从head开始比较,直到找到需要插入的位置。


/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode insertionSortList(ListNode head) {
        ListNode p = head==null?null:head.next;  // 考虑为空的情况
        ListNode previous = head; // p指向当前遍历到的节点,previous指向之前一个节点
        while(p!=null){
            if(p.val<previous.val){ // 递增顺序,不变
                if(head.val>p.val){ // 先考虑head的情况
                    previous.next = p.next;
                    p.next = head;
                    head = p;
                    p=previous.next;
                }else{
                    ListNode t = head; // t是用来查找之前插入位置的
                    while(t.next.val<p.val){ // 用next比较,是因为要找到要插入的位置的前一个节点
                        t=t.next;
                    }
                    previous.next = p.next;
                    p.next = t.next;
                    t.next = p;
                    p=previous.next;
                }
              
            }else{
                previous = previous.next;
                p=p.next;
            }
        }
        return head;
    }
}