leetcode_147 Insertion Sort List

题目分析:

  • 链表的插入排序实现。

解题思路:

  • 两种方法实现

    遍历实现

    1)利用四个节点实现,其中一个节点指向当前带插入节点,一个节点指向带插入节点的下一个节点,一个节点记录待插入链表实际该插入位置的前一个元素,一个节点指向其带插入链表该插入位置的下一个节点;

    2)遍历链表,每次先记录当前带插入节点的下一个节点,然后从有序链表的表头开始遍历查找,当出现逆序时,将此节点插入即可。

  • 实现程序

    //对链表执行插入排序
    struct ListNode *insertionSortList(struct ListNode *head)
    {
        if (head == NULL)
            return NULL;
        if (head->next == NULL)
            return head;
        //建立一个虚初始节点
        struct ListNode *temp = (struct ListNode *) malloc (sizeof(struct ListNode));
        temp->next = head;
        struct ListNode *p = head->next;
        head->next = NULL;
        struct ListNode *r;
        struct ListNode *h1; 
        struct ListNode *h2; 
        while (p != NULL)
        {
            //记录下一个元素
            r = p->next;
            h1 = temp->next;
            h2 = temp;
            //从前向后扫描比较进行插入 
            while (h1 != NULL)
            {
                //出现逆序,进行插入 
                if (h1->val > p->val)
                {
                    h2->next = p;
                    p->next = h1;
                    break;
                }
                else
                {
                    h1 = h1->next;
                    h2 = h2->next;  
                }
            }
            if (h1 == NULL)
            {
                h2->next = p;
                p->next = NULL;
            }
            p = r;  
        } 
        return temp->next;
    } 
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值