LeetCode 25. K 个一组翻转链表

K 个一组翻转链表

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

方法一、模拟法

我们需要把链表节点按照 k 个一组分组,所以可以使用一个指针 head 依次指向每组的头节点。这个指针每次向前移动 k 步,直至链表结尾。对于每个分组,我们先判断它的长度是否大于等于 k。若是,我们就翻转这部分链表,否则不需要翻转。
接下来问题转化为:
1.翻转k个子链表,注意首尾连接
2.巧妙构造头结点,方便操作链表

Swift

//k个一组翻转链表
    func reverseKGroup(_ head: ListNode?, _ k: Int) -> ListNode? {
        let dummyNode = ListNode(0)
        dummyNode.next = head
        var p:ListNode? = dummyNode
        
        var head = head
        while head != nil {
            var tail:ListNode? = p
            
            for _ in 0..<k {
                tail = tail?.next
                guard tail != nil else {return dummyNode.next}
            }
            
            let nex = tail?.next
            let result = reverseListNode(head, tail)
            head = result.0
            tail = result.1
            
            var res = head
            while let result = res {
                print(result.val)
                res = result.next
            }
            
            //链接反转后的链表
            p?.next = head
            tail?.next = nex
            p = tail
            head = nex
        }
        return dummyNode.next
    }

//翻转链表,返回新的头和尾
    func reverseListNode(_ head:ListNode?, _ tail:ListNode?) -> (ListNode?, ListNode?) {
        //记录未反转时最后一个元素的下一个,反转后保持链接状态
        var nextNode = tail?.next
        var p = head
        
        while nextNode !== tail {
            let nex = p?.next
            p?.next = nextNode
            nextNode = p
            p = nex
        }
        
        return (tail, head)
    }

OC

- (ListNodeOC *)reverseKGroup:(ListNodeOC *)head
                      inteval:(NSInteger)k {
    //创建哑巴节点
    ListNodeOC *dummyNode = [[ListNodeOC alloc] initWithVal:0];
    dummyNode.next = head;
    ListNodeOC *p = dummyNode;
    
    while (head != nil) {
        ListNodeOC *tail = p;
        
        for (NSInteger i=0; i<k; i++) {
            tail = tail.next;
            if (!tail) {
                return dummyNode.next;
            }
        }
        
        ListNodeOC *pre = tail.next;
        
        NSArray *result = [self reverseListNode:head tail:tail];
        head = result.firstObject;
        tail = result.lastObject;
        
        //链接首尾顺序
        p.next = head;
        tail.next = pre;
        p = tail;
        head = pre;
    }
    return dummyNode.next;
}

- (NSArray *)reverseListNode:(ListNodeOC *)head tail:(ListNodeOC *)tail {
    ListNodeOC *previ = tail.next;
    ListNodeOC *p = head;
    
    while (previ != tail) {
        ListNodeOC *nex = p.next;
        p.next = previ;
        previ = p;
        p = nex;
    }
    
    return @[tail, head];
}

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

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

相关文章

7.14解数独(LC37-H)

算法&#xff1a; 二维递归&#xff08;递归时需要两层for循环&#xff09; 一个for循环放行 另一个for循环放列 画树&#xff1a; 因为这个树形结构太大了&#xff0c;我抽取一部分&#xff0c;如图所示&#xff1a; 回溯三部曲&#xff1a; 1.确定函数参数和返回值 返…

windows机器上安装mysql

0、mysql下载地址 1、参考文章 2、把Data数据目录迁移到其他盘 2.0 首先停止mysql&#xff08;任务管理器-详细信息-随便找个进程右击进入转入服务&#xff0c;找到MySQL服务&#xff0c;点击停止&#xff09; 2.1 windows的 mysql默认的data目录在C:\ProgramData\MySQL\MySQ…

2024年MySQL学习指南(二),探索MySQL数据库,掌握未来数据管理趋势

文章目录 前言4. DDL- 操作数据库4.1 查询4.2 创建数据库4.3 删除数据库4.4 使用数据库 5. DDL- 操作数据表5.1 数据类型5.2 查询表5.3 创建表5.4 删除表5.5 修改表 6. 实战案例详解 前言 接上一篇文章【2024年MySQL学习指南&#xff08;一&#xff09;】 4. DDL- 操作数据库 …

基于人工智能的数据库工具Chat2DB使用

文章目录 前言Chat2DB介绍Chat2DB地址下载安装 Chat2DB配置Chat2DB使用1、自然语言转sql2. SQL解释3. SQL优化4. SQL转换 写在最后 前言 随着人工智能的发展&#xff0c;各行各业都出现了不少基于AI的工具来提升工作效率。就连国内的各个大厂也都在基于大模型开发自己的产品线…

企业培训系统开发: 技术创新引领学习革新

在现代企业管理中&#xff0c;培训成为推动员工发展和企业创新的核心。随着科技的快速发展&#xff0c;企业培训系统的开发已经成为提高培训效果、降低成本的有效途径。本文将介绍企业培训系统开发的一些关键技术和代码实例&#xff0c;展示如何通过技术创新引领学习革新。 1…

LeetCode 83:删除排序链表中的重复元素

一、题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输…

Web自动化测试:POM设计模式的实现

关于pom设计模式(project Object model/PageObject)&#xff0c;一种底层、逻辑、用例的分层&#xff0c;在项目还没有开发出来时&#xff0c;就可以开始写UI自动化脚本了&#xff0c;在开发完成后&#xff0c;再进行元素定位的适配以及调试&#xff1b;而且也可以多人共同维护…

web3 : blockscout剖析

Blockscout 是第一个功能齐全的开源区块链浏览器,可供任何以太坊虚拟机 (EVM) 链使用。项目方可以下载并使用Blockscout作为其链的浏览器,用户可以轻松验证交易、余额、区块确认、智能合约和其他记录。 目录 Blockscout可以做什么主要特征blockscoutDocker容器组件Postgres 1…

MySQL8.0主从复制实现及遇到的个人问题

文章目录 1、准备两个服务器或者虚拟机2、主库配置3、从库配置4、配置过程中使用到的命令5、遇到的问题 1、准备两个服务器或者虚拟机 这里使用的VM虚拟机的Centos、MySQL版本是8.0.26、使用FinalShell进行远程操作。 2、主库配置 修改MySQL配置文件(/etc/my.cnf) #启用二进…

《深入理解JAVA虚拟机》学习笔记

1.java内存结构&#xff0c;以及每个结构的作用&#xff1f; 线程共享区 堆内存:所有的对象实例都要在堆上分配方法区:是各个线程共享的内存区域&#xff0c;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据非线程共享区 Java虚拟机栈:每…

Sentinel使用

前言&#xff1a; 所有的准备工作都做好了&#xff0c;就可以进入到Sentinel的具体使用上了&#xff0c;这里还需要一个测试工具叫做jmeter&#xff0c;是一个很好的测试工具&#xff0c;专门针对并发的&#xff0c;准备好以后&#xff0c;就可以直接开干了。 一、Sentinel作用…

2下载Spring,第一个Spring程序+Log4j

https://www.yuque.com/dujubin/ltckqu/kipzgd#&#xff0c;注意的是&#xff0c;现在&#xff08;202401&#xff09;SpringFramework从release搬到了snapshot下&#xff0c;在这下面找到6.0.2下载. 下载后解压到文件夹&#xff0c;整个框架包含非常多jar包。 然后就可以在p…

UMLChina书籍大全(2024)软件方法人月神话人件企业应用架构模式UML参考手册彩色UML建模领域驱动设计对象设计……

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下列出有UMLChina标记的书。 首先是写了十几年还没有写完的软件方法 其他的是译作&#xff1a; 人月神话 2002年&#xff0c;UMLChina和清华大学出版社合作&#xff0c;翻译了《人…

linux性能优化

文章目录 性能优化图CPU进程和cpu原理性能指标 性能优化图 CPU 进程和cpu原理 进程与线程&#xff1a; 进程是程序的执行实例&#xff0c;有自己的地址空间和系统资源。线程是进程内的执行单元&#xff0c;共享进程的资源。在多核系统中&#xff0c;使用多线程可以更好地利用多…

倒排索引

正向索引&#xff1a;id&#xff08;序号&#xff09;--》 内容&#xff08;文档或记录&#xff09;--》关键词 &#xff0c;这个过程。 倒排索引&#xff1a;关键词 --》id&#xff08;序号&#xff09;--》内容&#xff0c;这个过程。 在有些图书的最后也有倒排索引的例子 …

Elasticsearch 中映射参数doc_values 和 fielddata分析比较

一、doc_values 默认情况下&#xff0c;大部分字段是索引的&#xff0c;这样让这些字段可被搜索。倒排索引&#xff08;inverted index&#xff09;允许查询请求在词项列表中查找搜索项&#xff08;search term&#xff09;&#xff0c;并立即获得包含该词项的文档列表。 倒排…

适口性好的猫粮:性价比高的主食冻干测评推荐

冻干猫粮因其高营养和适口性&#xff0c;受到了众多铲屎官们的喜爱和追捧。冻干猫粮的喂养方式非常简单&#xff0c;可以直接喂食&#xff0c;也可以将冻干复水后喂食&#xff0c;根据猫咪的不同喜好可以选择不同的喂养方式。然而&#xff0c;有些铲屎官在选择冻干猫粮时会担心…

反距离加权水平内插,附matlab代码(ERA5和GNSS站点不并址的处理方法之水平补偿)

1.内插方法 我在学习过程&#xff0c;内插方法为反距离加权水平内插&#xff0c;分享我的方法和公式&#xff0c;以及matlab代码。 2.使用该内插法的原因 GNSS与ERA5格网位置不并址&#xff0c;需要进行水平方向和垂直方向的补偿的补偿获得。水平方向不并址如第3节图所示&am…

羊大师讲解,羊奶为什么更适合高血压人群?

羊大师讲解&#xff0c;羊奶为什么更适合高血压人群&#xff1f; 高血压是一种常见的健康问题&#xff0c;它会引起诸多并发症并增加心脑血管疾病的风险。与此同时&#xff0c;人们越来越关注饮食对健康的影响。作为一种营养丰富且适合高血压人群的饮品&#xff0c;羊奶备受关…

如何使用 Python+selenium 进行 web 自动化测试?

Selenium是一个自动化测试工具&#xff0c;它可以模拟用户在浏览器中的操作&#xff0c;比如点击、输入、选择等等。它支持多种浏览器&#xff0c;包括Chrome、Firefox、Safari等等&#xff0c;并且可以在多个平台上运行。 安装和配置Selenium 在使用Selenium之前&#xff0c;…