题目描述:
对链表进行插入排序。
题目链接
算法描述:
插入排序算法:
1.插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
2.每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
3.重复直到所有输入数据插入完为止
举例说明:
思路分析:
1.将待排序链表的头拿出,作为新链表的头,然后依次把剩余的结点插入到以这个头为头的新链表中。
2.确定插入位置:从前往后遍历,为当前要插入的结点找到正确的插入位置即可。
- 第一种情况:头插
//头插
if(cur->val<=sortHead->val)
{
cur->next = sortHead;
sortHead = cur;
}
- 第二种情况:中间插入
//中间插入
struct ListNode* sortPrev = sortHead;
struct ListNode* sortCur = sortPrev->next;
while(sortCur!=NULL)
{
if(cur->val>sortCur->val)
{
sortPrev = sortPrev->next;
sortCur = sortPrev->next;
}
else
{
//确定位置 插入
cur->next = sortCur;
sortPrev->next = cur;
break;
}
}
- 第三种情况:尾插
//尾插
if(sortCur == NULL)
{
sortPrev->next = cur;
cur->next = NULL;
}
代码实现:
struct ListNode* insertionSortList(struct ListNode* head){
if(head == NULL|| head->next == NULL)
{
return head;
}
//拿出头作为新链表的头
struct ListNode* sortHead = head;
struct ListNode* cur = sortHead->next;
sortHead->next = NULL;
while(cur!=NULL)
{
struct ListNode* next = cur->next;
//头插
if(cur->val<=sortHead->val)
{
cur->next = sortHead;
sortHead = cur;
}
//中间插
else
{
struct ListNode* sortPrev = sortHead;
struct ListNode* sortCur = sortPrev->next;
while(sortCur!=NULL)
{
if(cur->val>sortCur->val)
{
sortPrev = sortPrev->next;
sortCur = sortPrev->next;
}
else
{
//确定位置 插入
cur->next = sortCur;
sortPrev->next = cur;
break;
}
}
//尾插
//不是因break跳出
if(sortCur == NULL)
{
sortPrev->next = cur;
cur->next = NULL;
}
}
cur = next;
}
return sortHead;
}