【算法 -- LeetCode】(025) K 个一组翻转链表

news/2024/10/19 6:22:53/

在这里插入图片描述

1、题目

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

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

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

示例 1:
在这里插入图片描述

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

示例 2:
在这里插入图片描述

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

题目链接:https://leetcode.cn/problems/reverse-nodes-in-k-group

2、图解

题目要求在一个链表中以 k 个链表节点为单位进行反转,什么意思呢?

你可以想象把一个很长的链表分成很多个小链表,每一份的长度都是 k (最后一份的长度如果小于 k 则不需要反转),然后对每个小链表进行反转,最后将所有反转后的小链表按之前的顺序拼接在一起。

其实 链表的题目并不需要特别强的逻辑推理,它主要强调细节实现,难也是难在细节实现上面 ,虽然大致的方向知道,但是很可能写着写着就会乱

所以这个题目实现的时候要把握住几个要点:

  • 第一,在反转子链表的时候,上一个子链表的尾必须知道

  • 第二,下一个子链表的头也必须知道

  • 第三,当前反转的链表的头尾都必须知道

3、Java 示例代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null || k <= 1) {return head;}ListNode dummy = new ListNode(0);dummy.next = head;ListNode pointer = dummy;while (pointer != null) {// 记录上一个子链表的尾ListNode lastGroup = pointer;int i = 0;            for (; i < k; ++i) {pointer = pointer.next;if (pointer == null) {break;}}// 如果当前子链表的节点数满足 k, 就进行反转// 反之,说明程序到尾了,节点数不够,不用反转if (i == k) {// 记录下一个子链表的头ListNode nextGroup = pointer.next;// 反转当前子链表,reverse 函数返回反转后子链表的头ListNode reversedList = reverse(lastGroup.next, nextGroup);// lastGroup 是上一个子链表的尾,其 next 指向当前反转子链表的头// 但是因为当前链表已经被反转,所以它指向的是反转后的链表的尾pointer = lastGroup.next;// 将上一个链表的尾连向反转后链表的头lastGroup.next = reversedList;// 当前反转后的链表的尾连向下一个子链表的头pointer.next = nextGroup;}}return dummy.next;}private ListNode reverse(ListNode head, ListNode tail) {if (head == null || head.next == null) {return head;}ListNode prev = null, temp = null;while ((head != null) && (head != tail)) {temp = head.next;head.next = prev;prev = head;head = temp;}return prev;}
}

执行结果:
在这里插入图片描述


http://www.ppmy.cn/news/971711.html

相关文章

分组密码模式的填充

分组加密 在密码学中&#xff0c;分组加密(Block cipher)&#xff0c;又称分块加密或块密码&#xff0c;是一种对称密钥算法。 它将明文分成多个等长的模块(block)&#xff0c;使用确定的算法和对称密钥对每组分别加密解密。 常见的分组加密算法有: DES、3DES、AES、IDEA。 …

SpringBoot启动时通过启动参数指定logback的位置

虽然springboot可以通过简单的配置使用日志系统&#xff0c;但是由于业务往往很复杂&#xff0c;对日志的多样性配置要求比较高&#xff0c;还是习惯于依赖于logback框架本身的配置文件。在spring boot中&#xff0c;使用logback配置的方式常用的有以下几种&#xff1a; 第一种…

CRM中的电话销售之营销分析

电话销售的报告打上去了&#xff0c;一直没消息&#xff0c;也不知R的意见如何&#xff0c;是不想做还是没想好怎么做&#xff0c;不管他怎么想了&#xff0c;我还是先研究吧&#xff0c;谁知道什么时候又要开始做呢。 看了CR750&#xff0c;发现讲的都是电话销售执行中的场景和…

一文了解Python中的while循环语句

目录 &#x1f969;循环语句是什么 &#x1f969;while循环 &#x1f969;遍历猜数字 &#x1f969;while循环嵌套 &#x1f969;while循环嵌套案例 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;Python从入门到精通专栏 循环语句是什…

Linux网络基础 — 数据链路层

目录 数据链路层 认识以太网 局域网转发的原理 认识以太网的MAC报头 以太网帧格式 认识MAC地址 对比理解MAC地址和IP地址 基于MAC帧协议再次谈一谈局域网转发的原理 认识MTU MTU对IP协议的影响 MTU对UDP协议的影响 MTU对于TCP协议的影响 ARP协议 ARP协议的作用 …

ARP系统的命令行基础

系列文章目录 华为数通学习&#xff08;2&#xff09; 一、基本命令结构 二、命令行视图 设备提供了多样的配置和查询命令&#xff0c;为便于用户使用这些命令&#xff0c;VRP系统按功能分类将命令分别注册在不同的命令行视图下。 2.1&#xff0c;命令行视图介绍 我们接下来…

55 | Python 连接 MySQL 数据库

文章目录 第一步:建立数据库连接第二步:创建游标第三步:执行 SQL 语句第四步:获取查询结果第五步:关闭游标和数据库连接错误处理在 Python 中,我们可以使用 pymysql 或 mysql-connector-python 等模块来连接 MySQL 数据库。本文将介绍如何使用 Python 连接 MySQL 数据库。…

PhpStudy靶场首页管理

PhpStudy靶场首页管理 一、源码一二、源码二三、源码三四、源码四 一、源码一 index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>靶场访问首页</title><style>body {background-color: #f2f2f2;colo…