链表的排序 ---链表插入排序

链表的插入排序

 
Insertion Sort List
 
1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。而对有链表,没有办法随机读取。所以插入排序,对每一个节点来说,只能从头节点开始,慢慢的向后开始比较,如果找到位置则将节点插入序列中。
 
代码如下,leetcode accept.
 
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if(head ==NULL|| head->next ==NULL)
          return head;
          
          ListNode * dummy = new ListNode(-1);
          dummy->next = head;   
          
          ListNode * pre = head ;
          ListNode * cur = head->next ; // 从第二个节点开始
          
          while(cur)
          {
              if(pre->val > cur->val)  // 这里假设从 头节点到 pre 节点 之间 是排好序的
              {
                  ListNode *tmp = dummy;
                  while(tmp->next->val<cur->val)
                     tmp= tmp->next;
                    
                    pre->next = cur->next;   // 将pre 与cur 后面的节点连接
                    cur->next = tmp->next;   // cur 插入适当的位置
                    tmp->next = cur;
                     
              }
              else 
                 pre = pre->next ;   
                 
                 cur = pre->next;
          }
          
          return dummy->next;
          
    }
};

 

posted @ 2015-08-10 16:29  deanlan  阅读(1121)  评论(0编辑  收藏  举报