(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;
}
}