题目:
使用插入排序排序一个链表。
思路:
什么是插入排序?
每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
新建一个链表用于存放有序结果;指定一个遍历指针用于遍历原始无序链表,指向当前正在排序的节点;指定一个位置指针用于遍历有序链表,查找插入的位置,注意被排序节点与位置指针的后一个节点进行比较。
代码:
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public ListNode insertionSortList(ListNode head) {
if(head==null || head.next==null) return head;
ListNode cur=head; //遍历指针,指向正在排序的节点
ListNode helper=new ListNode(0); //一个空链表,存放顺序结果 调用构造函数
/*因为可能待插入的节点可能在第一个节点的前面,
因此另外创建一个头结点,指向已经排好序的链表的第一个节点。
这样可以每次插入新的节点的时候,将上面所提到的记录节点初始化为新创建的头结点,
这样便于在第一个节点前面插入新节点。*/
ListNode pre;
while(cur!=null)
{
ListNode next=cur.next;
pre=helper;
while(pre.next!=null && pre.next.val<cur.val)
{
pre=pre.next;
}
cur.next=pre.next;
pre.next=cur;
cur=next;
}
return helper.next;
}