链表选择排序
2019-01-07 14:37
656 查看
class Solution { private static ListNode[] getAndRemoveTheSmallest(ListNode head) { if (head == null) { return null; } ListNode min = head; ListNode pre = null; ListNode minPre = null; ListNode[] result = new ListNode[2]; result[0] = head; while (head != null) { if (head.val < min.val) { min = head; minPre = pre; } pre = head; head = head.next; } if (minPre != null) { minPre.next = min.next; } else { result[0] = min.next; } min.next = null; result[1] = min; return result; } private static ListNode function(ListNode head) { if (head == null) { return null; } ListNode resultHead = null; ListNode resultTail = null; while (head != null) { ListNode[] noSorted = getAndRemoveTheSmallest(head); if (resultHead == null) { resultHead = noSorted[1]; resultTail = noSorted[1]; } else { resultTail.next = noSorted[1]; resultTail = resultTail.next; } head = noSorted[0]; } return resultHead; } private static void print(ListNode head) { while (head != null) { System.out.println(head.val); head = head.next; } } public static void main(String[] args) { ListNode n1 = new ListNode(1); ListNode n2 = new ListNode(0); ListNode n3 = new ListNode(1); ListNode n4 = new ListNode(4); ListNode n5 = new ListNode(5); ListNode n6 = new ListNode(2); ListNode n7 = new ListNode(7); ListNode n8 = new ListNode(8); n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; n5.next = n6; n6.next = n7; n7.next = n8; ListNode head = function(n1); print(head); } } class ListNode { int val; ListNode next; 1c7c ListNode(int x) { val = x; } }
相关文章推荐
- [C/C++]反转链表
- 判断链表是否有环,并返回链表的第一个节点
- 复制含有随机指针节点的链表
- 两个链表生成相加链表
- LeetCode - 234. 回文链表
- 将单向链表按某值划分成左边小、中间相等、右边大的形式
- 将单向链表按某值划分成左边小、中间相等、右边大的形式(O(1)空间复杂度,稳定划分)
- 链表
- 图解算法系列之选择排序
- 图解算法系列之插入排序(Low版)
- 改良的选择排序
- 最基础的动态数据结构:链表
- LeetCode - 141. 环形链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言之复杂链表的复制详解
- C#如何自定义线性节点链表集合
- C语言数据结构 link 链表反转的实现
- C语言数据结构之使用链表模拟栈的实例
- C++数据结构与算法之判断一个链表是否为回文结构的方法