题目:Sort a linked list using insertion sort,即仿照插入排序(直接插入排序)对一个链表排序。

插入排序的思想:总共进行n-1趟排序,在排列第i个元素时,前面的i个元素是有序的,将第i个元素插入到前i个元素中,并且保证被插入的数组是有序的,数组是顺序存储的,因此向有序的数组插入一个元素时,需要从插入位置之后的各个元素后移。这就是插入排序的思想。插入排序的时间复杂度O(n^2),是稳定的排序方法。链表并不是顺序存储,因此,再将第i个节点插入到前i个节点,并保证有序时,需要指针的复杂运算。

要判断一次插入是否是插入到链表的最前方,因为这样会有head指针的变化。插入时,需要找到插入位置,且找到插入位置的前驱节点,找到并且找到待插节点的前驱。这个题目本身不难,但是花了好长时间,终于AC,思路值得记下来,也许到了用的上的时候就写不出来了,常看看。。。。

/**
* 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) return NULL;
if(head->next==NULL) return head;
// ListNode *p = head;
ListNode *q = head->next;
while(q!=NULL)
{
ListNode *f = head;
while(f!=q)
{
if(q->val < f->val)
{
ListNode *qf = f;
while(qf->next!=q)
{
qf = qf->next;
}//找到q的前驱节点
if(f==head)
{
head = q;
qf->next = q->next;
q->next = f;
q = qf->next;
}
else
{
ListNode *p = head;
while(p->next!=f)
{
p = p->next;
}//找到待插入节点的前驱
qf->next = q->next;
q->next = f;
p->next = q;
q = qf->next;
}
break;
}
else
{
f = f->next;
}
}
if(f==q)
q=q->next;
}
return head;
}
};

最新文章

  1. SQL Server时间粒度系列----第9节时间粒度示例演示
  2. [JS]笔记13之Date对象
  3. 2017年1月4日 星期三 --出埃及记 Exodus 21:30
  4. iOS_TCP和UDP的详解
  5. mysql 笔记
  6. 你真的了解UIView吗?
  7. C++使用throw抛出异常
  8. linux查看系统的启动时间和运行时间
  9. 机器人学 —— 轨迹规划(Configuration Space)
  10. Unit Test Generator
  11. Qt:无标题栏无边框程序的拖动和改变大小
  12. GCC编译C程序源代码
  13. 兼容ie\firefox\chrome的cursor
  14. IOS 整理
  15. 【WPF MaterialDesign 示例开源项目】 Work Time Manager
  16. python配置apache的web服务器方法(python的CGI配置)
  17. 阿里云配置安全组(配置入口port)
  18. 解决GOOGLE无法访问
  19. Ubuntu双网卡设置内外网上网的问题
  20. sqler sql 转rest api 源码解析(二) resp 协议

热门文章

  1. js json对象和数组对象
  2. mysql学习笔记1---mysql ERROR 1045 (28000): 错误解决办法(续:深入分析)
  3. hdu 5384 Danganronpa(字典树)
  4. Java多线程之Lock的使用&lt;转&gt;
  5. Android——OnCreate
  6. linux系统中/etc/syslog.conf文件解读
  7. 转载: crypto:start() 错误。
  8. pydoc介绍
  9. Yii2发送邮箱总结
  10. WebGL中的OpenGL着色器语言