You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何合并链表反转与右大值节点删除函数

合并函数实现方案

要把反转、删节点的逻辑整合,不需要外部多次手动调用reverse,核心是把「反转链表→删除不符合要求的节点→再次反转还原」的全流程封装到统一入口函数中,对外只暴露这一个调用入口即可。

注意原lesVal接收一级指针,但反转操作会修改链表头指针的指向,因此统一入口函数需要使用二级指针作为入参,保证头指针修改后外部能拿到正确的链表起始位置。

完整实现代码

// 链表节点结构定义(原有代码的节点结构,补全方便参考)
struct Elem {
    int number;
    Elem* next;
};

// 反转函数作为内部辅助函数,逻辑和原有实现完全一致
void reverse(Elem** listHead){
    Elem* next;
    Elem* curr = *listHead;
    Elem* temp = NULL;
    while (curr != NULL){
        next = curr->next;
        curr->next = temp;
        temp = curr;
        curr = next;
    }
    *listHead = temp;
}

// 删值逻辑作为内部辅助函数,和原有lesVal逻辑一致,仅调整变量名提升可读性
void removeSmallerNodes(Elem* listHead){
    Elem* temp;
    Elem* curr = listHead;
    Elem* currMax = listHead;
    while (curr != NULL && curr->next != NULL){
        if (curr->next->number < currMax->number){
            temp = curr->next;
            curr->next = temp->next;
            delete temp;
        }
        else{
            curr = curr->next;
            currMax = curr;
        }
    }
}

// 对外暴露的统一处理函数,外部只需要调用这一个函数即可完成需求
void removeNodesWithLargerRight(Elem** listHead){
    // 内部自动完成全流程,不需要外部手动调用反转
    reverse(listHead);
    removeSmallerNodes(*listHead);
    reverse(listHead);
}

调用方式

替换原有三行分散的调用即可:

// 原有调用逻辑
// reverse(&first);
// lesVal(first);
// reverse(&first);

// 新的调用方式
removeNodesWithLargerRight(&first);

补充说明

  • 两个辅助函数的核心逻辑不需要修改,仅做封装即可,不会引入额外的逻辑bug
  • 如果需要进一步减少函数数量,可以把反转、删节点的代码全部写到removeNodesWithLargerRight内部,但拆分辅助函数的写法可读性更高,后续调试、修改逻辑更方便
  • 现有逻辑天然兼容空链表边界场景:如果传入的链表头为空,或者链表本身无节点,代码不会触发空指针访问问题

内容的提问来源于stack exchange,提问作者EBo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 20:48:14