当前位置: 首页 > article >正文

力扣刷题——25.K个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

要解决这道题,就要利用部分反转链表的方法,具体可以参考我的上一篇博客力扣刷题——92.反转链表||-CSDN博客,这里不再赘述,重点是如何循环地反转链表的多个部分。在反转链表的方法中,我们定义了

ListNode dummy(0,head);
listNode *p0=&dummy;
ListNode *p1=nullptr;
ListNode *p2=p0->next;
并在循环中定义了p3=p2->next;,然后在循环中让它们一直向后移动,不断改变节点指向。而在这道题中,在一次反转结束后p0还指向当前反转的部分链表的头节点,我们需要将p0移动到指向下一次反转的头节点,也即是当前部分链表的尾节点,然后重新定义p1,p2,p3再移动下一部分。

ListNode* reverseKGroup(ListNode* head, int k) {
        int len=0;
        ListNode dummy(0,head);
        ListNode *p0=&dummy;
        for(ListNode* p=head;p;p=p->next)
        {
            len++;
        }
        while(len>=k)
        {
            ListNode *p1=nullptr;
            ListNode *p2=p0->next;
            for(int i=0;i<k;i++)
            {
                ListNode *p3=p2->next;
                p2->next=p1;
                p1=p2;
                p2=p3;
            }
            p0->next->next=p2;
            p0->next=p1;
            for(int j=0;j<k;j++)
            {
                p0=p0->next;
            }
            len-=k;
        }

        return dummy.next;
    }


http://www.kler.cn/a/593954.html

相关文章:

  • 深拷贝在 JavaScript 中的几种实现方式对比
  • xss-labs靶场训练
  • 调和Django与Sql server2019的关系
  • 【leetcode hot 100 208】实现Trie(前缀树)
  • HAl库开发中断方式接收Can报文的详细流程
  • 使用AI一步一步实现若依前端(15)
  • 体检管理页面开发:问题总结与思考
  • Kali Linux更改国内镜像源
  • 传输层协议 — TCP协议与套接字
  • Cannot find module @rollup/rollup-win32-x64-msvc
  • Linux驱动学习笔记(五)
  • 解锁C++标准库:从理论到实战的进阶指南
  • 【电路笔记】-D型触发器
  • Java的输入
  • page.json和manifest.json
  • 蓝桥杯备考:数学问题模运算---》次大值
  • DeepSeek重构产业生态:餐饮、金融与短视频的智能跃迁
  • SAP-ABAP:SAP系统架构技术白皮书
  • 注册安全工程师考试科目有哪些?
  • 第J3周:DenseNet121算法实现01(Pytorch版)