Sort a linked list using insertion sort.

Subscribe to see which companies asked this question

解答

对于链表的插入排序,用tmp_tail遍历链表,每次的待插入数是tmp_tail->next的元素,待插入数必须从头开始比较,当然从头开始比较时要注意处理待排序数小于或等于链表首元素的情况,因为插入在链表的首元素之前与一般情况的插入不同,而如果待插入数插入在它之前的数列中,则用于遍历链表的指针tmp_tail不需要移动,这与数组不同,毕竟数组插入时是要将部分数组元素整体移动的,而链表不需要,将待插入数插入在前面的链表中后tmp_tail的下一个数就是待排序数,但是如果待插入数保持原位不动,则需要将tmp_tail后移一个,因为新的待插入数是原先待插入数的下一个数,判断待插入数是否在原位只需要在遍历结束后判断tmp_tail->next是否等于tmp_node(待插入数)即可。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* insertionSortList(struct ListNode* head) {
    struct ListNode *tmp_node, *tmp_head, *tmp_tail = head;

    if(NULL == tmp_tail){
        return head;
    }
    while(NULL != tmp_tail->next){
        tmp_node = tmp_tail->next;
        if(head->val >= tmp_node->val){
            tmp_tail->next = tmp_node->next;
            tmp_node->next = head;
            head = tmp_node;
        }
        else{
            tmp_head = head;
            while(tmp_node != tmp_head->next){
                if(tmp_head->next->val < tmp_node->val){
                    tmp_head = tmp_head->next;
                }
                else{
                    tmp_tail->next = tmp_node->next;
                    tmp_node->next = tmp_head->next;
                    tmp_head->next = tmp_node;
                    break;
                }
            }
            if(tmp_tail->next == tmp_node){
                tmp_tail = tmp_tail->next;
            }
        }
    }

    return head;
}

最新文章

  1. C#遍历DataSet中数据的几种方法总结
  2. docker windows 7 mysql安装使用教程
  3. Android课程---final关键字
  4. 11.写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
  5. C# 字典排序Array.Sort
  6. 我的HTML笔记
  7. Struts2(十二)使用验证框架验证数据较验
  8. Vim插件安装
  9. ubuntu全盘备份与恢复
  10. ios Object Encoding and Decoding with NSSecureCoding Protocol
  11. Crossin 8-3;8-4
  12. vue生命周期图片
  13. 集合排序 Comparator和Comparable的使用区别
  14. vue----less引用
  15. PAT Basic 1004
  16. 【Python56--爬取妹子图】
  17. Frame animation
  18. [SQL ERROR 800]Corresponding types must be compatible in CASE expression.
  19. 【jdk源码分析】ArrayList的size()==0和isEmpty()
  20. 最小生成树-普利姆算法lazy实现

热门文章

  1. MongoDB学习笔记一:入门
  2. 几个排序算法的python实现
  3. Python chr() ord() unichr()
  4. Flume+Kafka+Strom基于伪分布式环境的结合使用
  5. UE用法
  6. Asp.net MVC 之过滤器
  7. java的基本认识
  8. 使用C#访问SQLLite
  9. ucenter 整合外部网站,实现登录等操作
  10. Linux Install VirtualBox