链表中的节点每k个一组翻转

核心思路是先统计链表总长度,确定需要反转的组数,再逐组局部反转并重新连接,计算出需要反转的组数s = n/k;然后循环s次,每次对当前 k 个节点进行局部反转,反转后将当前组的首尾与前后部分重新连接,最后返回处理后的链表头。
对应的代码解析如下:
class Solution {public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(!head || k == 1) return head; // 空链表或k=1无需反转 
        ListNode* dummy = new ListNode(0); // 虚拟头节点,简化头节点处理
        dummy->next = head;
        ListNode* cur = head;
        ListNode* pre = dummy; // 记录上一组的尾节点
        ListNode* next = nullptr;
        ListNode* prev = nullptr;
        ListNode* temp = nullptr; // 记录当前组反转前的头节点   
        int n = 0;
        while(cur != nullptr) {
            n++;
            cur = cur->next;
        }
        cur = head;
        if(n == 1) return head; // 只有1个节点直接返回
        int s = n / k; // 计算需要反转的组数
        while(s--) {
            for(int i = 0; i < k; i++) {
                if(i == 0) temp = cur; // 记录当前组反转前的头节点
                next = cur->next;
                cur->next = prev; // 当前节点指向前一个反转节点
                prev = cur;
                cur = next;
            }
            pre->next = prev;
            temp->next = cur;
            pre = temp; // 更新上一组的尾节点为当前组反转前的头节点
            prev = nullptr; // 重置反转前驱指针
        }
        ListNode* newhead = dummy->next;
        delete dummy; // 释放虚拟头节点,避免内存泄漏
        return newhead;
    }};
该解法的时间复杂度为 O (n),空间复杂度为 O (1)。
全部评论

相关推荐

11-29 03:15
门头沟学院 Java
1.面试官自我介绍2.自我介绍+说项目的难点3.jwt是什么?怎么使用的?(项目用了)4.jwt的具体内容(只使用了后端返回的token,没了解具体内容是什么)5.flex:1是什么6.水平垂直居中方法7.布局方法用什么比较多?8.js的数据类型有哪些9.基本数据类型和引用类型有什么区别10.介绍栈,队列,堆,链表11.介绍闭包(要详细一点,所以把闭包的特征和使用的情况也说了12.介绍函数里的this13.手写call方法,一边写一边说思路(大概写出来了,有一点点小问题)14.promise和ajax有了解过吗?(ajax只了解了原生的,就详细介绍了一下promise的定义、几种状态、常用的不同方法)15.什么时候用promise.all?16.有没有了解过跨域问题?项目里有用到吗?(这里把同源策略说成不同域名才跨域了,面试官有指出是要端口、协议、域名都相同才同源)17.你说到了websocket,简单介绍一下,项目里有用到吗?(没用到,不过把概念和使用场景都说了)18.http1.0/http1.1/http2.0/http3.019.Cache-Control是用来做什么的?20.强缓存和弱缓存有哪些?21.项目里用了useTransition,其实这个在实际业务里用得不是很多,你是怎么想到要用这个的22.useTransition和useState有什么区别23.useCallback和useMemo有什么区别24.有没有用到自定义的hooks,项目里有用到吗,介绍一下25.项目里用了ISR和动态导入,ISR和SSR有什么区别26.怎么考虑用React和Next.js来做项目的?只是想巩固学过的知识还是有什么别的考虑?27.你想在实习过程中获得什么呢?28.代码题:旋转矩阵
查看27道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务