题意:
用插入排序来给一个单链表排序。
分析:
插入排序是遍历数组,然后,将这个数放在其左边(已经有序)的数组的有序位置。
但是链表不能倒序遍历,交换也很麻烦,我们用一个新数组来插入。
思路很简单,难的是实现。我一直认为链表只要细心的记录要改变的结点,把握好每一次断键,连键(比如插入等基本操作),以及判断空。这三件事情,就没什么问题了。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode insertionSortList(ListNode head) { if(head == null || head.next == null) return head; ListNode newHead = new ListNode(0); ListNode newp = newHead; ListNode oldp = head; ListNode oldpNext = null; while(oldp != null){ //遍历旧链表 oldpNext = oldp.next; while(newp.next!=null && newp.next.val < oldp.val){ //遍历新链表,寻找插入点 newp = newp.next; } //这时候,需要把oldp插入到newHead之后 oldp.next = newp.next; newp.next = oldp; //插入完成,旧数组指针往下走一位,新数组指针复原到链表头 oldp = oldpNext; newp = newHead; } return newHead.next; } }