qingcheng奕  

https://oj.leetcode.com/problems/insertion-sort-list/

链表实现插入排序

首先插入排序是指:

a b c d e g m 对b也就是第二个位置选做元素num开始遍历n-1次

对每个num,找到从第0个位置开始,它应该待的位置,把它插入进去。

对于链表来说,首先new一个 dummy 节点,这样比较方便对 head的操作 dummy->next = head。

然后从head->next为第二个元素,也就是从它开始遍历处理

每一次处理中从 dummy->next作为开始,因为 head 可能已经换位置了.

记录当前处理的位置的上一个位置,这样如果需要把这个点插入到前面,也就是从这个位置删除的话,就 before->next = num->next相当于删除了。

同时为了插入,即在合适的位置插入,需要记录要插入的上一个位置 num->next = pointer, before_should->next = num,相当于插入了。

 1 struct ListNode {
 2       int val;
 3       ListNode *next;
 4       ListNode(int x) : val(x), next(NULL) {}
 5   };
 6  
 7 class Solution {
 8 public:
 9     ListNode *insertionSortList(ListNode *head) {
10         if(head == NULL)
11             return NULL;
12         
13 
14         ListNode *dummy = new ListNode(-1);
15         dummy->next = head;
16         ListNode *before = head;
17         ListNode *before_bigger = dummy;
18 
19         for(ListNode *num = head->next; num!=NULL; num = num->next)
20         {
21             ListNode *point = NULL;
22             bool flag = false;
23             before_bigger = dummy;
24             for(point = dummy->next; point!= num; point=point->next)
25             {
26                 if(point->val > num->val)
27                 {
28                     flag = true;
29                     break;
30                 }
31                 before_bigger = before_bigger->next;
32             }
33 
34             //need insert
35             if(flag)
36             {
37                 before->next = num->next;
38                 before_bigger->next = num;
39                 num->next = point;
40                 num = before;
41             }
42             else 
43             {
44                 before = before->next;
45             }
46         }
47         return dummy->next;
48     }
49 };

 

posted on 2014-07-01 16:20  qingcheng奕  阅读(208)  评论(0)    收藏  举报