package wangChaoPA实习工作练习.com.leetcode;
public class InsertList
{
public ListNode insertionSortList(ListNode head)
{
if (head == null || head.next == null)
{
return head;
}
//头结点
ListNode dummy = new ListNode(-1);
//断开链表
dummy.next = null;
ListNode newNext, pre, next;
while (head != null)
{
//需要进行插入的下一个结点
next = head.next;
//获取到插入的前结点
pre = searchForIsertPos(dummy, head.val);
//newNext=null
newNext = pre.next;
//断开链表
head.next = newNext;
//前面排好序的链表进行连接
pre.next = head;
//head指向下一个需要插入的结点
head = next;
}
//返回首结点(头结点指向首结点)
return dummy.next;
}
// 获取到插入的前结点
public ListNode searchForIsertPos(ListNode head, int val)
{
ListNode pre = head;
ListNode next = head.next;
while (next != null && next.val <= val)
{
pre = next;
next = next.next;
}
return pre;
}
}
/**
*
* <p>
* 描述该类情况 {@link 代表跟谁有关系}
* </p>
*
* @author 王超
* @since 1.0
* @date 2017年5月11日 下午11:05:37
* @see 新建|修改|放弃
* @see wangChaoPA实习工作练习.com.leetcode.InsertList 插入排序算法的实现:插入一个结点 前面的都是排好序的 从小到大
* 对链表进行插入排序的正确方法是:新建一个头节点,遍历原来的链表,对原链表的每个节点找到新链表中适合插入位置的前指针,然后执行插入操作。
* 这种操作链表的题有一个技巧就是新建一个dummy作为head,然后把数据插入到dummy的链表中,最后返回dummy.next。
*/
class ListNode1
{
ListNode1 next;
int val;
ListNode1(int x)
{
this.val = x;
this.next = null;
}
}