(147)-(Insertion Sort List )-(用插入排序 对链表进行排序)-(从前到后,对于每一个元素找合适的插入位置,注意,保存要处理的下一个节点)

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

 

posted @ 2015-07-26 21:36  爱吃萝卜干  阅读(130)  评论(0编辑  收藏  举报