总结leetcode算法题147
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list
题目分析:
其实就是给定一个链表,将其按照要求进行排序。比如输入的是4 ->1 ->2 ->3,输出的结果是1 ->2 ->3 ->4。代码如下:
/**
* 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;
}
//可以理解为定义一个对象指向链表的第一个元素
ListCode point = head ;
//定义一个对象指向链表的下一个元素
ListCode nNode = point.next;
while(nNode!=null){
//顺序正常,无须调换位置
if(nNode.val >= point.val){//注意这里不可以换成head.val
point = nNode;
nNode = point.next;
//结束当前循环,进行下一次循环
continue;
}
//顺序不正常,需要调换顺序,先将该元素从链表中断开
point.next = nNode.next;
//判断断开的元素跟头元素比较,如果比头结点还小,直接让它作为头结点
if(nNode.val <= head.val){//这里不可以换成point.val
nNode.next = head;
head = nNode;
}else{
//需要遍历插入的位置
ListCode xNode = head;
while(true){
if(nNode.val <= xNode.next.val ){
nNode.next = xNode.next;
xNode.next = nNode;
break;
}
//如果当前元素比xNode.next.val小,那么xNode向后移动一位
xNode = xNode.next;
}
}
让point指向排好序的nNode的前一个元素
nNode = point.next;
}
return head;
}
}
*/
可能代码看起来比较麻烦,所以我根据自己的理解,绘制一些图便于理解。
一开始是这样的,我们假设输入的链表是4123,那么首先point指向第一个元素,nNode指向下一个元素
之后,进行判断nNode比前一个元素,也就是头结点小,所以我们需要将其从链表中断开,并且将point所指的元素指向nNode的下一个元素。如下所示
接下来判断断开来的元素和头元素谁大谁小,如果比头元素还小,直接让它做头结点,很明显,比头结点4还小,所以直接让其下一位指向头结点,将该元素变成头结点。
nNode.next = head;
head = nNode;
之后开始下一次循环,nNode!=null成立,所以判断nNode和point谁大谁小,很明显,顺序不需要调整,直接变换位置,如下图
跳出当前循环,继续下次循环,这次2<4,所以需要判断,2和1谁大,很明显,2需要进行寻找合适的插入位置,设xNode=head,则如图所示
判断xNode.next也就是4和2的大小,所以2需要插入1和4中间,只需要将
nNode.next = xNode.next;
xNode.next = nNode;
之后的操作如上所示,这里就不再赘述了。以上就是我对于此题解法的理解,如果有错误或者更优解,请批评指正。