单链表插入排序(带头结点与不带头结点)

insertion-sort-list
链表插入排序(由小到大)。
输入:链表的头指针,
输出:排序后链表的头指针。
实现方法:将原链表拆成两部分:链表1仍以head为头指针,链表结点有序。链表2以head2为头指针,链表结点无序。
将链表2中的结点依次插入到链表1中,并保持链表1有序。
最后链表1中包含所有结点,且有序。

带头结点

ListNode* insertionSortList(ListNode* head) { 
        if(head == NULL||head->next == NULL)  return head; 
        ListNode* newhead = new ListNode(0);       //新建辅助头结点; 

        ListNode* p,*q,*pre;      
        p=head;

        while(p!=NULL) 
        { 
                q = p->next;     //记录下一个结点; 
                pre = newhead;   //每次都遍历一次新链表; 
               while(pre->next != NULL && pre->next->val < p->val)    
                { 
                    pre=pre->next; 
               } 
               p->next=pre->next; 
               pre->next=p; 
               p=q; 
        } 
        return newhead->next; 
    } 

不带头结点

ListNode *insertionSortList(ListNode* head) {

        if(head == NULL || head->next == NULL)  return head;

        ListNode* p ,*q, *pre, *post;       
        p = head->next;
        head->next = NULL;

        while(p != NULL)
            {
               q = p;
               post = head;
               while(post != NULL && post->val <= q->val)
               {
                    pre = post;
                    post = post->next;
               }
               p = p->next;
               if(post == head)
                   {
                      head = q;
               }
               else
                   {
                      pre->next = q;
               }
               q->next = post;
        }
        return head;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值