首页 > 其他分享 >25. K 个一组翻转链表(难)

25. K 个一组翻转链表(难)

时间:2025-01-05 13:54:58浏览次数:1  
标签:25 end cur next 链表 节点 翻转

目录

题目

  • 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
    k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
    你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

法一、模拟--迭代

  • 遍历列表,到达计数k将k个用头插法翻转,注意翻转后连接回整个链表。没有达到k不进行翻转
var reverseKGroup = function(head, k) {
  // 创建一个虚拟节点,以简化边界条件处理
  let dummy = new ListNode();
  dummy.next = head; // 将虚拟节点的next指向原链表的头节点
  let [start, end] = [dummy, dummy.next]; // start指向虚拟节点,end指向链表的第一个节点
  let count = 0; // 计数器,用于计数节点

  // 遍历链表,直到end为null
  while(end) {
    count++; // 计数节点数量
    // 当计数到k的倍数时,表示需要进行翻转
    if (count % k === 0) {
      // 翻转start到end之间的链表
      start = reverseList(start, end.next);
      end = start.next; // 更新end为翻转后的链表的下一个节点
    } else {
      end = end.next; // 移动end指针
    }
  }
  return dummy.next; // 返回翻转后的链表头节点,即dummy.next

  // 翻转start到end之间的链表
  function reverseList(start, end) {
    let [pre, cur] = [start, start.next]; // pre指向start,cur指向start的下一个节点
    const first = cur; // 记录翻转后的第一个节点
    // 头插法进行翻转,直到cur等于end
    while(cur !== end) {
      let next = cur.next; // 记录cur的下一个节点
      cur.next = pre; // 将cur的next指向pre,实现翻转
      pre = cur; // 移动pre到cur
      cur = next; // 移动cur到下一个节点
    }
    // 将翻转后的子链表连接前后
    start.next = pre; // 将start的next指向翻转后的第一个节点
    first.next = cur; // 将翻转后的第一个节点的next指向end(即cur)
    return first; // first经过翻转应该在子链表最后
  }
};

法二、递归

var reverseKGroup = function(head, k) {
    let cur = head;
    let count = 0;
    // 求k个待反转元素的首节点和尾节点
    while(cur != null && count != k){
        cur = cur.next;
        count++;
    }
    // 足够k个节点,去反转
    if(count == k){
        // 递归链接后续k个反转的链表头节点
        cur = reverseKGroup(cur,k);
        while(count != 0){
            count--;
            // 反转链表
            let tmp = head.next;
            head.next = cur;
            cur = head;
            head = tmp;
        }
        head = cur;
    }
    return head;
};

标签:25,end,cur,next,链表,节点,翻转
From: https://www.cnblogs.com/lushuang55/p/18653210

相关文章

  • 日常训练2025-1-5
    日常训练2025-1-5L.BridgeRenovationrating:1400https://codeforces.com/problemset/problem/2038/L思路(贪心)需要思考每种板子的组合方式,最好的组合方式是两个2号板子和1个1号板子,加起来只消耗一块板子。其次是三块1号板子加起来只消耗一块板子。然后就是两块任意板子......
  • 2025毕设ssm天商美食点评网程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着互联网技术的飞速发展,美食点评类网站和平台在人们的日常生活中扮演着越来越重要的角色。大众对于美食的追求不再局限于单纯的品尝,还包括分享......
  • 2025毕设ssm前途招聘求职网站程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展,就业市场竞争日益激烈。一方面,每年有大量的学生毕业涌入求职市场,他们面临着寻找合适工作岗位的压力,需要获取广泛且精准的招聘信息......
  • 创作错误(每次重新启动丢失原链表)
    #include<stdio.h>#include<conio.h>#include<windows.h>#include<stdlib.h>#include<string.h>#include<time.h>voidgotoxy(intx,inty){  COORDpos={x,y};  HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE);......
  • OJ随机链表的复制题目分析
    题目内容:138.随机链表的复制-力扣(LeetCode)分析: 这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析吧!1.题目要求的是链表的复制,那么我们得想我们该怎么做,才能很好地进行下去呢?2.是直接把原链表一个一个......
  • 2025毕设ssm实验室课程管理系统程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着科学实验规模的不断扩大,实验室课程数量急剧增加,有关实验室课程的信息量也呈指数级增长。传统的实验室课程管理方式在面对如此庞大的信息量时......
  • 2025毕设ssm停车场管理系统程序+论文
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着现代社会的快速发展,汽车保有量不断攀升,停车场的规模和复杂度也日益增加。传统的停车场管理方式往往依赖人工操作,存在效率低下、容易出错、管......
  • 2025年,勇敢探索,才能突破困境
    新年第一篇文章,不聊技术,聊聊今年的计划,以及未来的发展趋势。在24年的第一篇文章中,我用“苟住求活”这个词形容了我当时的判断,如今回过头再看2024年,大家都过的很挣扎。经济环境进一步恶化,就业机会越发的稀少,降本增效降薪裁员,是去年很多人的真实经历。今年的判断依然没有大的改变......
  • 2024-2025-1(20241321)《计算机基础与程序设计》第十五周学习总结
    学号20241321的《计算机基础与程序设计》课程总结第一周:第三周第四周第五周第六周第七周第八周第九周第十周第十一周第十二周第十三周第十四周整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点回答一下第1周作业中自己提出的问题问题:cpu......
  • 2025年 的思考
    2025年的思考1.如何用一年的时间重生,如何从0到1开启个人事业2.人只有处在最能发挥其才能的岗位上,才会干得好.3.想要获得金钱,你不能追着它跑;你要反过来,让钱来找你.4.别让任何困难阻止你追寻梦想.5.面对当前的不如意,我们更该打磨技能,而非轻易放弃.6.不复盘,掉过的坑还会再掉,走......