(147)-(Insertion Sort List )-(用插入排序 对链表进行排序)-(从前到后,对于每一个元素找合适的插入位置,注意,保存要处理的下一个节点) //Sort a linked list using insertion sort //我去,英语水平太差,翻译了一下 //用插入排序 对链表进行排序 //首先,神马是插入排序, //百度百科 所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去, //直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。 //伪代码 public static void InsertSort(int[] arr) { int i, j; int n = arr.Length; int target; //假定第一个元素被放到了正确的位置上 //这样,仅需遍历1 - n-1 for (i = 1; i < n; i++) { j = i; target = arr[i]; while (j > 0 && target < arr[j - 1]) { arr[j] = arr[j - 1]; j--; } arr[j] = target; } } */ //最简单的方式是,,遍历这个链表,变成数组,处理后,再恢复成链表 //但是有点逗啊,我还是老实做吧 //涉及到两个元素的交换,如果是头节点,很崩溃的。 //而且还涉及到拼命的前向遍历,这是很可怕的,单链表不能实现的 //百度了一下,,发现自己想多了,你直接回去进行二重遍历,从头开始看比大小, //我不想写了,好不清晰啊 public class Solution { public ListNode insertionSortList(ListNode head) { if(head == null) { return null; } ListNode final_ans = new ListNode(0); ListNode pre = final_ans; ListNode temp = head; while(temp!=null) { //记录下一个进行处理的节点 ListNode curr_next = temp.next; //结果链表的头,遍历--表明合适的插入位置前的一个元素 pre = final_ans; //结果链表中遍历,因为处理的是.next,所以遍历到倒数第二个 while(pre.next!=null && pre.next.val<=temp.val) { pre = pre.next; } //temp到了它该插入的位置了 //(pre) (temp) (pre.next) ListNode save_node=pre.next; pre.next=temp; temp.next = save_node; //temp赶紧回到自己之前保存的下一个节点中,进行处理 temp=curr_next; } return final_ans.next; } }