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
相关产品推荐
相关产品推荐

