c++的查漏补缺 1、函数指针

今天写链表的插入排序时遇到了一个问题

    void InsertionSortList(ListNode* head, int n){
        if (!head||!head->next) return nullptr;
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto pre = head;
        auto cur = head->next;
        while (cur != NULL){
            auto tmp = dummy;
            if (pre->val > cur->val){ //pre 其实是已排序序列对尾那个元素的位置(属于已排序序列),如果当前元素比队尾元素小则说明需要将其插入到有序序列中;如果比队尾元素大就不用管它,因为他本来就是插在队尾后面的那个元素。
                while (tmp->next->val < cur->val) //从头开始比较
                    tmp = tmp->next; // 在已排序序列中(前方部分),从头向后遍历,直至找到适合当前值的位置。找到时tmp指向的节点后面的位置是cur的位置,也就是tmp的val小于cur的val,tmp->next的val大于cur的val。
                pre->next = cur->next; //cur弹出当前序列
                cur->next = tmp->next; //确定cur的下一个元素
                tmp->next = cur; //确定cur前面的元素
                cur = pre->next; //处理下一个节点
            }
            else{ //pre的下一个元素可以直接放入有序序列中
                pre=pre->next;
                cur = cur->next;
            }
        }
        head = dummy->next;
    }

以上代码实际上是无法更改head的指的,因为此时这里的head只是原链表头head的一个复制,就是没有引用的形参,我一开始被他指针的外表迷惑了,认为只要传入指针就是对原内容进行修改了。但实际上我在日常使用时,使用指针修改的是这块地址上对应的变量的值,相当于指针的上一级的内容。
修改方案
1、使用指针的指针

    void InsertionSortList(ListNode** phead, int n){
        ListNode* head = *phead;
        if (!head||!head->next) return ;
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto pre = head;
        auto cur = head->next;
        while (cur != NULL){
            auto tmp = dummy;
            if (pre->val > cur->val){ //pre 其实是已排序序列对尾那个元素的位置(属于已排序序列),如果当前元素比队尾元素小则说明需要将其插入到有序序列中;如果比队尾元素大就不用管它,因为他本来就是插在队尾后面的那个元素。
                while (tmp->next->val < cur->val) //从头开始比较
                    tmp = tmp->next; // 在已排序序列中(前方部分),从头向后遍历,直至找到适合当前值的位置。找到时tmp指向的节点后面的位置是cur的位置,也就是tmp的val小于cur的val,tmp->next的val大于cur的val。
                pre->next = cur->next; //cur弹出当前序列
                cur->next = tmp->next; //确定cur的下一个元素
                tmp->next = cur; //确定cur前面的元素
                cur = pre->next; //处理下一个节点
            }
            else{ //pre的下一个元素可以直接放入有序序列中
                pre=pre->next;
                cur = cur->next;
            }
        }
        *phead = dummy->next;
    }

2、使用指针的引用

    void InsertionSortList(ListNode*& head, int n){
        if (!head||!head->next) return ;
        auto dummy = new ListNode(-1);
        dummy->next = head;
        auto pre = head;
        auto cur = head->next;
        while (cur != NULL){
            auto tmp = dummy;
            if (pre->val > cur->val){ //pre 其实是已排序序列对尾那个元素的位置(属于已排序序列),如果当前元素比队尾元素小则说明需要将其插入到有序序列中;如果比队尾元素大就不用管它,因为他本来就是插在队尾后面的那个元素。
                while (tmp->next->val < cur->val) //从头开始比较
                    tmp = tmp->next; // 在已排序序列中(前方部分),从头向后遍历,直至找到适合当前值的位置。找到时tmp指向的节点后面的位置是cur的位置,也就是tmp的val小于cur的val,tmp->next的val大于cur的val。
                pre->next = cur->next; //cur弹出当前序列
                cur->next = tmp->next; //确定cur的下一个元素
                tmp->next = cur; //确定cur前面的元素
                cur = pre->next; //处理下一个节点
            }
            else{ //pre的下一个元素可以直接放入有序序列中
                pre=pre->next;
                cur = cur->next;
            }
        }
        head = dummy->next;
    }

确实是很基础的内容了,之前一直在用python,对c++落下的有点多了,加油查漏补缺吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值