l类比数组的插入排序
对每个节点先找到插入的位置
将该节点插入到该位置
(主要就是链表指针的移动)
package CLinkedList;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/10 0010 16:10
*/
public class Problem147 {
//插入排序
public ListNode insertionSortList(ListNode head) {
if(head==null||head.next==null) return head;
//哨兵节点
ListNode dummy = new ListNode(-1);
dummy.next=head;
ListNode cur = head.next;
ListNode preCur = head;
while(cur!=null) {
//从第一个元素开始进行比较
ListNode temp = dummy.next;
//记录这个方便删除
ListNode preTemp = dummy;
//寻找插入位置
while (temp != null) {
//找到cur还是没有插入位置说明不用动,直接跳出
if (temp == cur) break;
//在temp出找到插入位置跳出
if (temp.val > cur.val) break;
//不断移动弄指针寻找插入位置
temp = temp.next;
preTemp = preTemp.next;
}
//需要删除
if (temp != cur) {
ListNode cur_next = cur.next;
//将cur节点插入到temp节点处
//需要将cur之前的节点直接指向cur.next
//将cur节点插入到temp节点之前
//因此需要保存几个节点
//1、将cur之前的节点指向cur之后的节点将cur节点先解放出来
preCur.next = cur.next;
//2、将带插入节点中插入cur节点
cur.next = temp;
preTemp.next = cur;
//遍历下一个节点
cur = cur_next;
}else{//不需要删除
preCur=cur;
cur=cur.next;
}
}
return dummy.next;
}
public static void main(String[] args) {
ListNode head = new ListNode(6);
ListNode A = new ListNode(5);
ListNode B = new ListNode(3);
ListNode C = new ListNode(7);
ListNode D = new ListNode(8);
ListNode E = new ListNode(1);
ListNode F = new ListNode(2);
head.next=A;
A.next=B;
B.next=C;
// C.next=D;
// D.next=E;
// E.next=F;
Problem147 problem147 = new Problem147();
problem147.insertionSortList(head);
}
}