Leetcode_147_对链表进行插入排序
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head==null){
return head;
}
else{
//res.next为返回值,res.next指向链表头
ListNode res = new ListNode();
res.next=head;
//last为有序部分的终点,初始化为head
ListNode last = head;
//goal为待排序的节点
ListNode goal = head.next;
while(goal!=null){//当goal==null时循环结束
if(head==last){//判断头节点是否等于有序区终点,其实是对两个元素的判断,初始化
if(goal.val<head.val){//头节点大于目标,则将,目标置于头节点前
ListNode node = new ListNode(goal.val);
node.next=head;
res.next=node;
head.next=head.next.next;
head=res.next;
goal=goal.next;
}else{//头节点小于目标,则last和goal向后移一位
last=last.next;
goal=goal.next;
}
}else{
if(goal.val>=head.val&&goal.val<head.next.val){//找到合适的插入位置后
ListNode node = new ListNode(goal.val);
node.next=head.next;
head.next=node;
last.next=goal.next;
goal=goal.next;
head=res.next;
}else if(goal.val<head.val&&head==res.next){//小于头节点,则直接插入到头节点前
ListNode node= new ListNode(goal.val);
node.next=head;
res.next=node;
last.next=goal.next;
goal=goal.next;
head=res.next;
}else if(goal.val<head.val&&head!=res.next){//如果不是头节点,则从头节点开始遍历
head=res.next;
}
else{
head=head.next;
}
}
}
return res.next;
}
}
}