Insertion Sort List leetcode oj

本文详细介绍了如何使用直接插入排序方法对链表进行排序,包括链表结点的插入与删除操作,以及具体实现代码。通过遍历链表并根据结点值进行插入,实现对链表的有效排序。

题目大意:用插入排序算法对链表进行排序。
题目解析:与数组的插入排序相比,链表不需要将数据整体后移再插入,只需要改变指针。本文采用直接插入排序方法,主要涉及到的知识点是链表结点的插入与删除(即断点重连)。
本文算法:
1.判断链表是否为空或仅有一个节点,是则直接返回;
2.遍历除头结点外的每一个结点进行直接插入排序,每个结点都从头结点开始比较并寻找插入位置。这里分为两种情况:
(1)如果当前结点数据域小于头结点,首先将当前结点的前驱结点与后继结点重新连接,然后将当前节点指向当前头结点,并将当前结点变成头结点(即head=Cur;);
(2)如果当前结点数据域大于头结点,则遍历当前结点之前的所有结点,直到找到大于当前结点数据域的结点位置Insertpos,(即while(Cur->val)>=(Insertpos->val) ,”=”是为了保证直接插入排序的稳定性),这里还是分为两种情况:
1)插入位置与当前结点位置相同,则保持不变,继续处理下一结点;
2)如果不同,则进行(1)中的断点连接与当前点的插入;
3.遍历结束(Pre->next=NULL),return head.
具体实现代码如下:(代码并不复杂,只是说的比较啰嗦~~)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
//链表为空或只有一个结点直接返回//
if(head==NULL || head->next==NULL) return head;
ListNode *Pre,*Cur,*Insertpos,*temp;
Insertpos=head;
Pre=head;
do//遍历链表进行直接插入排序//
{
Insertpos=head;//当前结点插入后,将指针重新指向头结点,每次都从头结点开始比较//
Cur=Pre->next;
if(Cur->val< Insertpos->val)//当前结点小于头结点//
{
Pre->next=Cur->next;//连接断点//
Cur->next=Insertpos;
head=Cur;//将当前点插入到头结点之前//
continue;//处理下一结点//
}
while((Cur->val)>=(Insertpos->val) && Insertpos!=Cur)//否则查找当前点插入位置//
{
temp=Insertpos;//保存当前位置//
Insertpos=Insertpos->next;
}
if(Insertpos==Cur)//当前点位置不动的情况//
{
Pre=Pre->next;
}
else
{
Pre->next=Cur->next;//连接断点//
Cur->next=temp->next;
temp->next=Cur;//将当前点插入相应位置//
}
}while(Pre->next);
return head;
}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值