package com.mxnet;
public class Solution147 {
public static void main(String[] args) {
}
/**
* Q: 给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头
* @param head
* @return
* 思路:
* 1. 先判断节点是否为空或者是否只有一个元素
* 2. 定义辅助节点dummyHead让其下一个元素指向head,方便可以在head前插入元素
* 3. 从第二个节点开始依次扫描节点,寻找当前节点要插入的位置
* 4. 找到其位置后将其插入
* 5. 返回dummyHead.next
*/
public ListNode insertionSortList(ListNode head) {
//若链表为空或者链表只有一个元素,直接返回head
if (head == null || head.next == null){
return head;
}
//创建dummyHead链表,让其后一个节点指向head
ListNode dummyHead = new ListNode();
dummyHead.next = head;
//定义辅助指针finalNode指向排好序的链表的最后,默认指向head
ListNode finalNode = head;
//定义辅助指针cur保存当前要插入的元素,默认指向head.next
ListNode cur = head.next;
while (cur != null){
if (cur.val >= finalNode.val){
finalNode = finalNode.next;
}else {
//创建辅助指针prev记录当前节点要插入位置的前一个位置
ListNode prev = dummyHead;
//从前往后扫描节点,寻找当前节点要插入的位置
while (prev.next.val <= cur.val){
prev = prev.next;
}
//找到要插入的位置后将其插入
//将排好序链表的最后一个元素指向当前节点的下一个元素
finalNode.next = cur.next;
//将当前节点进行插入
cur.next = prev.next;
prev.next = cur;
}
//节点后移,判断下一个节点
cur = finalNode.next;
}
return dummyHead.next;
}
}