算法通关村第二关—K个一组反转(黄金)

       K个一组翻转链表

题目介绍

 LeetCode25.给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

image.png

1.头插法

 如果虚拟结点理解了,会发现头插法比上面的穿针引线法更好理解,主要思路还是将其分成已经反转、正在反转和未反转三个部分。为了方便循环,我们可以先遍历一遍链表,统计一下元素数量len,确定要分几组n=len/k,然后再采用与前面青铜白银关一样的思路进行反转就可以了。下图表示的是反转结点5时的过程图:
image.png
代码实现:

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(k == 1) return head;
        ListNode node = head;
        int len = 0;
		//统计链表长度
        while(node != null){
            len++;
            node = node.next;
        }
        int sum = len / k; //统计反转次数
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode pre = dummy;
        ListNode cur = head;
		//外层循环是链表反转的次数,内层循环是每次反转需要反转的元素的个数
        for(int i = 0; i < sum; i++){
            for(int j = 1; j <= k - 1; j++){
                ListNode next = cur.next;
                cur.next = next.next;
                next.next = pre.next;
                pre.next = next;
            }
            pre = cur;
            cur = cur.next;
        }
        return dummy.next;
    }
}

2.穿针引线法

 这种思路与上面的穿针引线类似,我们根据图示一点点看:
 首先,因为要分组反转,我们就一组一组的处理,将其分成已经反转、正在反转和未反转三个部分,同时为了好处理头结点,我们新建一个虚拟头结点。之后我们直接遍历,根据是否为K个找到四个关键位置,并用变量pre、start、end和next标记,如下:
image.png
image.png
 接着我们就可以对上图中颜色部分进行反转了,我们如果end.next=null,那颜色部分可以直接复用前面的实现来完成反转。注意上图中指针的指向和几个变量的位置,hed表示传给反转方法的参数,结构如下
所示:
image.png
完成之后,我们要将裁下来的部分再缝到原始链表上,这就需要调整指针指向了,同样注意指针的指向:
image.png
代码实现:

public ListNode reverseKGroup(ListNode head, int k){
ListNode dummy = new ListNode (0);
dummy.next = head;
ListNode pre = dummy;
ListNode end = dummy;
while (end.next != null){
//找到要处理的区间的末尾
for (int i= 0;i < k && end != null; i++){
end = end.next;
}
if (end == null){
break;
}
//将要处理的区间裁剪下来
ListNode start = pre.next;
ListNode next = end.next;
end. next = null;
//执行反转
pre.next = reverse(start);
/!上面pre.next和下面start.next两个指针是为了将反转的区间缝补回去
start.next = next;
//调整指针,为下一组做准备
pre = start;
end = pre;
}
return dummy.next;
}
//复用前面小节中的实现
private ListNode reverse(ListNode head){
ListNode pre = null;
ListNode curr = head;
while (curr != null){
ListNode next = curr.next;
curr.next = pre;
pre = curr:
curr = next;
}
return pre;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/223486.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA竞赛_考试赢积分兑换专题课活动

温馨提示&#xff1a;明德扬特别组织了考试竞赛赢积分活动&#xff0c;欢迎大家积极参加考试&#xff01;我是本次活动的负责人小易老师。 一.考试兑换FPGA专题课 1积分1元.可以兑换FPGA专题课&#xff08;例如&#xff1a;拿到1000积分&#xff0c;课程售价999元&#xff0c…

第三方组件自定义扫描规则

第三方例如dubbo自定义扫描组件规则方式注入进容器。例如DubboService注解的类注入进容器中&#xff0c;实现ImportBeanDefinitionRegistrar接口&#xff0c;并通过Import注解注入。 Import除了注入ImportBeanDefinitionRegistrar类&#xff0c;还可以注入配置类Configuration和…

微信小程序音乐播放器

项目预览 项目说明 听歌音乐播放器(小程序)&#xff0c;本项目的目的是为了方便听歌用户&#xff0c;随时随地听歌&#xff0c;不需要下载APP,即用即听 运行项目时&#xff0c;微信开发者工具只需将 dist 文件夹放入即可。另&#xff0c;请将微信开发者工具中的 【不校验合法…

什么是SD-WAN?软件定义WAN是如何工作的?

下午好&#xff0c;我的网工朋友。 宽带接入以及Internet骨干网容量的持续提升&#xff0c;促使企业WAN技术变革。 在已有专线的基础上&#xff0c;SD-WAN提供了一种低成本的快捷方案&#xff0c;正受到业界的追捧。 今天就和你科普一波企业WAN技术的演进&#xff0c;再来说说…

二百一十三、Flume——Flume拓扑结构介绍

一、目的 最近在看尚硅谷的Flume资料&#xff0c;看到拓扑结构这一块&#xff0c;觉得蛮有意思&#xff0c;于是整理一下Flume的4种拓扑结构 二、拓扑结构 &#xff08;一&#xff09;简单串联 1、结构含义 这种模式是将多个flume顺序连接起来了&#xff0c;从最初的sourc…

常见的Bean工厂后置处理器

此代码在jdk11上测试通过&#xff0c;SpringBoot版本为2.7.14 1.上代码 导入坐标 <dependencies><!-- spring数据坐标 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</art…

一文搞懂Git版本控制系统

1. Git简介 当涉及到软件开发或协作时&#xff0c;版本管理是一个不可或缺的概念。无论你是一个独立开发者还是一个团队成员&#xff0c;都会遇到需要跟踪和管理代码变更的情况。这时候&#xff0c;Git作为一个强大而流行的版本控制系统就发挥着重要的作用。 Git&#xff08;读…

wait notify

文章目录 1. API 介绍2. 怎么使用wait、notify2.1 sleep 和 wait 的区别2.2 sleep 和 wait 的使用模板 1. API 介绍 都属于 Object 对象的方法。必须获得此对象的锁&#xff0c;才能调用这几个方法&#xff0c;只有重量级锁才能调用wait、notify obj.wait() 让进入 object 监…

ROS小练习——话题发布

目录 一、话题与消息获取 1、话题 2、消息 二、代码编写 1、C 2、python 三、编译运行 一、话题与消息获取 打开小乌龟案例 1、话题 rqt_graph rostopic list 2、消息 获取消息类型: rostopic type /turtle1/cmd_vel 获取消息格式: rosmsg info geometry_msgs/Twi…

JAVA IO:NIO

1.阻塞 IO 模型 ​ 最传统的一种 IO 模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线程交出 CPU。当…

做亚马逊需要IP代理吗?需要纯净度高的吗?

做亚马逊跨境电商的老玩家都知道&#xff0c;代理IP的作用不容小觑。通过代理IP&#xff0c;跨境电商卖家可以进行深入的市场研究&#xff0c;获取关键的数据分析&#xff0c;助力业务决策。让卖家能够安全轻松管理不同地区的账户&#xff0c;轻松防关联&#xff0c;无缝对接多…

国内AI翘楚,看看有没有你心动的offer?

科技创新争占高地&#xff0c;AI领域各显神通。从一战成名的阿尔法狗到引起轩然大波的ChatGPT&#xff0c;我们早已卷入了一场没有硝烟的革命。前方世人看到的科技日新日异、岁月静好&#xff0c;后方是各大企业的绞尽脑汁、争先恐后。人工智能时代&#xff0c;AI是挡不住的时代…

草柴返利APP领淘宝天猫优惠券拿购物返利 淘宝天猫订单如何隐藏删除订单记录?

草柴返利APP领淘宝天猫优惠券拿购物返利 手机安装「草柴」返利APP&#xff0c;复制要购买的商品链接到草柴&#xff0c;查询该商品淘宝天猫优惠券及购物返利&#xff0c;确认收货后到草柴返利APP提取返利&#xff1b; 淘宝天猫订单如何隐藏删除订单记录&#xff1f; 1、打开手…

035.Python面向对象_三大特性_封装、继承、多态

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

Linux横向移动

Linux横向移动 主机存活探测 shell for i in 192.168.111.{1..254}; do if ping -c 3 -w 3 $i &>/dev/null; then echo $i is alived; fi; done 或者 for k in $( seq 1 255);do ping -c 1 192.168.1.$k|grep "ttl"|awk -F "[ :]" {print $4}; d…

现代雷达车载应用——第1章 雷达简介

“雷达”一词代表无线电探测和测距。雷达是一种电磁系统&#xff0c;用于探测、定位、跟踪和识别一定区域内的不同物体。雷达向目标方向发射电磁能量&#xff0c;以观察目标的回波。目标可以是船只、飞机、天体、汽车等。在早期&#xff0c;雷达系统由于体积庞大&#xff0c;成…

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…

代码随想Day24 | 回溯法模板、77. 组合

理论基础 回溯法和递归不可分割&#xff0c;回溯法是一种穷举的方法&#xff0c;通常需要剪枝来降低复杂度。回溯法有一个选择并退回的过程&#xff0c;可以抽象为树结构&#xff0c;回溯法的模板如下&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}…

【数据结构】——二叉树简答题模板

目录 一、树和二叉树的概念&#xff08;一&#xff09;二叉树的定义和性质&#xff08;二&#xff09;树和二叉树的区别 二、完全二叉树和满二叉树三、二叉树的遍历&#xff08;一&#xff09;由序列确定二叉树&#xff08;二&#xff09;不同遍历序列的关系 四、二叉树的性质&…

在Vivado 仿真器中搭建UVM验证环境(不需要联合modelsim)

Vivado 集成设计环境支持将通用验证方法学 (UVM) 应用于 Vivado 仿真器。Vivado 提供了预编译的 UVM V1.2 库。 &#xff08;1&#xff09;在 Vivado 2019.2 中创建新 RTL 工程。 &#xff08;2&#xff09;单击“添加目录 (Add Directories)”以将“src”和“verif”目录添加…