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

力扣刷题——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;
    }

相关文章:

  • 【全国产化主板】解决方案探讨:CPU、FPGA、GPU、AI的融合与优化
  • 【最后203篇系列】020 rocksdb agent
  • 《视觉SLAM十四讲》ch13 设计SLAM系统 相机轨迹实现
  • Neo4j GDS-04-图的中心性分析介绍
  • 力扣977. 有序数组的平方(双指针技巧)
  • 【STM32】I²CC通信外设硬件I²CC读写MPU6050(学习笔记)
  • kubernetes高级实战
  • 6.3考研408数据结构中BFS与DFS的易错点及难点解析
  • 9、Python collections模块高效数据结构
  • 前端面试常考基础题目详解
  • 3月20号
  • 通过调整相邻分区实现Linux根分区扩容(ext4文件系统)
  • vue里localStorage可以直接用吗
  • Spring Boot 集成 Kafka 消息发送方案
  • idea配置gitee
  • QT 实现信号源实时采集功能支持频谱图,瀑布图显示
  • 【Linux进程】——进程的程序地址空间
  • B树与B+树在MySQL中的应用:索引
  • 华为OD机试-租车骑绿道-双指针(Java 2023 B卷 100分)
  • 【二分查找 并集查找】P6004 [USACO20JAN] Wormhole Sort S|普及+
  • 网站哪家做的比较好/免费职业技能培训网
  • 手机网站制作套餐/深圳百度推广属于哪家公司
  • 网站开发 避免 字段变化 代码/免费永久个人域名注册
  • 企业形象网站模板/广州建网站的公司
  • 网络规划设计师教程(第2版)pdf/成都关键词优化服务
  • 厦门市建设局网站住房保障/深圳靠谱网站建设公司