[LeetCode] 147. Insertion Sort List
2016-09-10 20:23
232 查看
思路:
用一个虚拟头结点放到前面, 这样好操作一点. 然后, 拿两个指针开始遍历链表, 当prev的next的val小于cur的val时, 就不停移动prev, 直到遇到比cur的值大的, 就停下, 把cur插进去. 但是要注意在外层循环开始的时候, 我们要判断一下prev有没有到链表尾部, 或者prev的next的值有没有大于等于cur的值, 如果这个情况发生了, 我们才要把prev置回链表首, 否则我们不需要每次都从头开始循环. 这样节省了很多时间.
用一个虚拟头结点放到前面, 这样好操作一点. 然后, 拿两个指针开始遍历链表, 当prev的next的val小于cur的val时, 就不停移动prev, 直到遇到比cur的值大的, 就停下, 把cur插进去. 但是要注意在外层循环开始的时候, 我们要判断一下prev有没有到链表尾部, 或者prev的next的值有没有大于等于cur的值, 如果这个情况发生了, 我们才要把prev置回链表首, 否则我们不需要每次都从头开始循环. 这样节省了很多时间.
ListNode* insertionSortList(ListNode* head) { if (! head || ! head->next) return head; ListNode dummy = ListNode(0); ListNode* prev = &dummy; ListNode* cur = head; ListNode* next = NULL; while (cur) { next = cur->next; if (! prev || ! prev->next || prev->next->val >= cur->val) prev = &dummy; while (prev->next && prev->next->val < cur->val) prev = prev->next; cur->next = prev->next; prev->next = cur; cur = next; } return dummy.next; }
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现的链表类实例
- 详解Redis用链表实现消息队列
- PHP小教程之实现链表
- PHP中模拟链表和链表的基本操作示例
- C语言双向链表的表示与实现实例详解