题意:
用插入排序来给一个单链表排序。
分析:
插入排序是遍历数组,然后,将这个数放在其左边(已经有序)的数组的有序位置。
但是链表不能倒序遍历,交换也很麻烦,我们用一个新数组来插入。
思路很简单,难的是实现。我一直认为链表只要细心的记录要改变的结点,把握好每一次断键,连键(比如插入等基本操作),以及判断空。这三件事情,就没什么问题了。
/**
* 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;
}
}