12.6 - K个一组翻转链表 && C 编译到执行的4个阶段

目录

1.K个一组翻转链表

a.核心思想

b.思路

c.步骤

[2.C 编译到执行的4个阶段](#2.C 编译到执行的4个阶段)

a.预处理

b.编译

c.汇编

d.链接


1.K个一组翻转链表

25. K 个一组翻转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-nodes-in-k-group/description/

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode dummy(0);
        dummy.next = head;
        ListNode *pre = &dummy;
        ListNode *end = &dummy;

        while (end->next != nullptr) {
            // 找到当前组的尾节点
            for (int i = 0; i < k; ++i) {
                end = end->next;
                if (end == nullptr) {
                    return dummy.next; // 不足k个节点,直接返回
                }
            }
            ListNode *nextGroup = end->next;
            ListNode *start = pre->next;
            ListNode *cur = start;
            ListNode *prev = nullptr;
            
            // 翻转当前组
            while (cur != nextGroup) {
                ListNode *temp = cur->next;
                cur->next = prev;
                prev = cur;
                cur = temp;
            }
            
            // 连接翻转后的组
            pre->next = end;
            start->next = nextGroup;
            
            // 更新指针
            pre = start;
            end = pre;
        }
        return dummy.next;
    }
};

a.核心思想

通过分组翻转+指针重构实现链表每k个节点一组的翻转。核心在于精准定位每组边界,完成局部翻转后重新连接链表,同时处理不足k个节点的剩余部分直接保留。哨兵节点(dummy)简化头节点翻转的特殊逻辑,三指针法实现高效翻转。

b.思路

**① 分组处理:**将链表按k个节点分组,完整组翻转,不完整组保留。

② 指针定位:preend指针定位每组边界,翻转后重新连接。

**③ 原地操作:**通过指针交换实现翻转,避免额外空间消耗。

c.步骤

① 初始化: 添加哨兵节点(dummy)简化头节点处理,初始化preend指针。

② 定位组尾: 移动end指针k步定位当前组尾节点,不足k则直接返回。

**③ 记录节点:**保存下一组起始位置和当前组起始节点。

④ 翻转 链表 **:**用三指针(cur, prev, temp)翻转当前组。

**⑤ 重新连接:**将翻转后的组与前驱和后继链表连接。

⑥ 指针迭代: 更新preend,处理下一组,直至链表结束。

**⑦ 返回结果:**返回哨兵节点的下一节点作为新链表头。

2.C 编译到执行的4个阶段

a.预处理

预处理阶段通过预处理器(如 cpp)处理源代码中的预处理指令(如 #include#define#ifdef 等),展开头文件、替换宏定义、删除注释,最终生成一个纯 C 代码的文本文件(.i 文件),为后续编译做准备。

b.编译

编译阶段将预处理后的代码转换为汇编代码,编译器(如 gcc)进行语法分析、语义分析和中间代码生成,最终输出特定架构的汇编指令文件(.s 文件),这一步实现了从高级语言到低级汇编语言的转换。

c.汇编

汇编阶段由汇编器(如 as)将汇编代码翻译为二进制机器码,生成目标文件(.o.obj),其中包含机器指令、符号表和待解析的外部引用,但尚未解决跨文件的函数或变量调用关系。

d.链接

链接阶段由链接器(如 ld)合并多个目标文件和库文件,解析符号引用(如函数或全局变量的地址绑定),整合代码段、数据段,最终生成可直接加载到内存执行的可执行文件(如 a.out.exe)。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
计算机安禾2 分钟前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio
专注API从业者5 分钟前
淘宝商品详情 API 与爬虫技术的边界:合法接入与反爬策略的技术博弈
大数据·数据结构·数据库·爬虫
C++ 老炮儿的技术栈8 分钟前
GCC编译时无法向/tmp 目录写入临时汇编文件,因为设备空间不足,解决
linux·运维·开发语言·汇编·c++·git·qt
橘颂TA16 分钟前
【笔试】算法的暴力美学——牛客 NC213140 :除2!
c++·算法·结构与算法
汀、人工智能40 分钟前
[特殊字符] 第66课:跳跃游戏
数据结构·算法·数据库架构·图论·bfs·跳跃游戏
汀、人工智能1 小时前
[特殊字符] 第70课:加油站
数据结构·算法·数据库架构·图论·bfs·加油站
wsoz1 小时前
Leetcode普通数组-day5、6
c++·算法·leetcode·数组
favour_you___1 小时前
2026_4_8算法练习题
数据结构·c++·算法
汀、人工智能1 小时前
[特殊字符] 第57课:搜索旋转排序数组
数据结构·算法·数据库架构·图论·bfs·搜索旋转排序数组
SccTsAxR1 小时前
算法基石:手撕离散化、递归与分治
c++·经验分享·笔记·算法