对链表进行插入排序(C语言实现)

题目描述

 

思路

此题是将原链表进行原地插入变为有序链表,可以取出头节点作为一个基准,从头节点往后,依次对比,适当使用头插、尾插、中间插入的办法。

解题方法

第一步,设置sortHead的头节点,以此作为基准

 

第二步,开始取节点比较,如果是比基准小则为头插,将节点头插进链表,再更新sotHead的头节点

 

第三步,比较的情况出现比头节点大的情况,因此设置sortCur,让cur的值与sortCur比较,sortCur永远比cur后进一位

 

第四步,出现比头节点大,比sortCur小的情况,属于中间插入,因此设置一个sortprev记录sortCur的前一位,cur插入这两位的中间
第五步,如果没有找到比sortCur小的节点,则需要将最后一位尾插进去,将cur->next置为空

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

 typedef struct ListNode Node;
struct ListNode* insertionSortList(struct ListNode* head) {
    if(head==NULL || head->next==NULL)
    {
        return head;
    }
    
    Node* cur=head->next;
    Node* sortHead=head;
    sortHead->next=NULL;
    
    while(cur)
    {
       Node* next=cur->next;
       
       //1.将cur头插进链表的情况
       if(cur->val <= sortHead->val)
       {
        cur->next=sortHead;
        sortHead=cur;
       }

       //2.将cur中间插入的情况
       else
       {
         Node* sortprev=sortHead;
         Node* sortCur= sortprev->next;
         //比较是否比sortCur的值大,找出中间插的位置
         while(sortCur)
         {
            if(cur->val<=sortCur->val)
            {
              sortprev->next=cur;
              cur->next=sortCur;
              break;
            }
            else//没有找到则迭代
            {
              sortprev=sortCur;
              sortCur=sortCur->next;
            }
         }
         //如果找到最后一个,则将cur与前面链表连接起来
         if(sortCur==NULL)
         {
            sortprev->next=cur;
            cur->next=NULL;
         }

       }
       //cur的迭代
       cur=next;
    }

    return sortHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值