单链表:链表中的节点每k个一组进行翻转

NC50 链表中的节点每k个一组翻转 一、题目: 描述 将给出的链表中的节点每k\ kk 个一组翻转,返回翻转后的链表 如果链表中的节点数不是k\ kk 的倍数,将最后剩下的节点保持原样 你不能更改节点中的值,只能更改节点本身。 要求空间复杂度 O(1)\ O(1)O(1) 例如: 给定的链表是1→2→3→4→51\to2\to3\to4\to51→2→3→4→5 对于 k=2\ k = 2k=2, 你应该返回 2→1→4→3→52\to 1\to 4\to 3\to 52→1→4→3→5 对于 k=3\ k = ... 阅读详情

链表中的节点每k个一组进行翻转

题目:
        将给出的链表中的节点每k个一组翻转,返回翻转后的链表。
        如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样。
        不能更改节点中的值,只能更改节点本身。
        要求空间复杂度为O(1)

示例:
        给定的链表是:1→2→3→4→5
        对于k = 2,你应该返回:2→1→4→3→5
        对于k = 3,你应该返回:3→2→1→4→5

思路:
        ① 题目要求我们每k个节点一组进行翻转。所以我们必须要明确每次要翻转的节点的范围。
        ② 对于我们确定好的范围,我们要进行该范围内的翻转链表。

        ③ 翻转链表后,又有新的问题,翻转后的链表怎么链到原链表中呢?我们可以通过指针来完成该操作。定义prev指针,用来保存一组待翻转链表的上一个节点,定义start,用来保存待翻转链表的第一个节点。再定义一个指针 next,用来保存待翻转链表的最后一个节点的下一个节点。这样,我们就能轻而易举的将翻转后的链表链到原链表中。

图示:
        ① 图示为链表初始状态,其中dummy是头结点,无实际意义。end、prev分别指向dummy。我们用 k = 2 来举例。
在这里插入图片描述
        ② 通过end,我们找到了待翻转链表的最后一个节点,然后我们需要找到待翻转链表的第一个节点,定义start指针,指向待翻转链表的第一个节点,然后我们还需要知道待翻转链表的最后一个节点的下一个节点,便于下一次我们找到新的一组待翻转链表的第一个节点。我们使用next指针记录待翻转链表的最后一个节点的下一个节点。如图所示:
在这里插入图片描述
        此时,翻转start、end范围内的节点,注意在翻转之前,我们应该将end.next置为null。这样才能准确地进行翻转。翻转结果如下图所示:
在这里插入图片描述
        接着我们将start所指向的节点的next域指向next,**prev指向的节点的next域指向我们新翻转后链表的第一个结点。**如下图所示:
在这里插入图片描述
        紧接着,我们调整end、prev、start、以便下一组链表翻转。此时应该将prev 指向start。 end指向start。 然后继续翻转下一组链表。继续通过for循环找到下一组链表的最后一个结点,如下图所示:

在这里插入图片描述
        翻转start、end范围内的结点,如下图所示:
在这里插入图片描述
        prev.next置为新翻转后的链表的第一个结点,start.next指向next。end、prev都指向start。如下图所示:
在这里插入图片描述
        继续重复上面的步骤,最后链表为:
在这里插入图片描述
代码实现:

    public ListNode reverseKGroup (ListNode head, int k) {
        if(head == null) return null;
        ListNode dummy = new ListNode(0); //链表头结点,无实际意义
        ListNode prev = dummy;
        ListNode end = dummy;
        dummy.next = head;
        while(end!=null){
            for(int i = 0; i<k && end!=null; i++){
                end = end.next;
            }
          
            if(end == null) break;
            ListNode next = end.next; //记录下一组链表的第一个节点
            end.next = null; //这组链表先与后面的链表断开连接。
            ListNode start = prev.next; // 记录待翻转链表的第一个节点,用于reverse()函数使用。
            prev.next = reverse(start); //reverse()函数返回翻转后链表的第一个节点。
            
            // 记录下一组链表的start、end以及其前一个节点。
            start.next = next; //新翻转的链表最后一个节点链接后面的节点。
            prev = start;
            end = prev;
            
        }
        return dummy.next;
    }
    
    private ListNode reverse(ListNode head){
        if(head == null) return null;
        ListNode cur = head;
        ListNode next = null;
        ListNode prev = null;
        while(cur!=null){
            next = cur.next;
            cur.next = prev;
            prev = cur;
            cur = next;
        }
        return prev;
    }
}
3-5 单链表分段逆转 (20 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。 函数接口定义: void K_Reverse( List L, int K ); 其中List结构定义如下: typedef struct Node *PtrToNode;... 阅读详情

相关推荐

算法题——链表中的节点每k个一组翻转

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

bm1998 938

K个一组反转单链表

K个一组反转单链表题目解决思路代码说明 题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 说明: (1)k 是一个正整数,它的值小于或等于链表的长度。 (2)如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例如下所示: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 解决思路 基于递归反转单链表第m到第n个节点的方法解决此题,该方法参考此博文:参考这里 初始化:先创建一个虚拟头结点ret,再定义一个指针p指向虚拟头结点

along_000的博客 2121

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)

本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。

weixin_30470643的博客 393

链表中的节点每k个一组翻转

链表中的节点每k个一组翻转

weixin_46525412的博客 641

MC1496乘法器AM调制电路搭建全流程(附Multisim 14.0仿真文件)

本文提供了基于MC1496乘法器搭建AM调制电路的完整实战指南。针对仿真模型缺失的痛点,详细讲解了从晶体管级手动构建MC1496等效模型,到外围电路设计、调制度参数计算与调节,并在Multisim 14.0中进行仿真验证的全流程。通过深度剖析MC1496内部原理与AM信号调制机制,帮助读者获得从仿真到实践的可控设计与排错能力。

weixin_29190169的博客 593

从编译到调通:RK3588与FPGA的PCIe XDMA驱动实战解析

本文详细解析了在RK3588平台上为FPGA板卡编译、加载与调试PCIe XDMA驱动的完整实战流程。内容涵盖环境准备、Makefile深度定制、编译排错、驱动加载与内核日志解读、设备节点分析以及用户空间编程实战,旨在帮助开发者打通RK3588与FPGA之间的高速PCIe通信链路,实现稳定可靠的数据传输。

weixin_29304021的博客 484

1.8单链表以k个节点为一组翻转

单链表以k个节点为一组进行翻转 解题思路: 首先把前K个结点看成一个子链表,采用前面介绍的方法进行翻转,把翻转后的子链表链接到头结点后面,然后把接下来的K个结点看成另外一个单独的链表进行翻转,把翻转后的子链表链接到上一个已经完成翻转子链表的后面 图示: 代码实现 # -*-coding:utf-8-*- """ @Author : 图南 @Software: PyCharm @Ti...

bangtuancheng1680的博客 257

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 266

java单链表节点翻转_LeetCode-25:K 个一组翻转单链表 | 难度:困难

一. 序链表作为一种基本的数据结构,本身理解起来很简单。它通过指针,将一组零散的内存空间(结点),串联起来,组成一个数据结构。在面试的算法题中,经常会碰到链表相关的面试题。虽然链表的结构比较好理解,但是链表的题还是比较考教代码能力的。一些单链表的题,指针指来指去,很容易就把结点的 next 指针弄丢了,造成链表断裂。链表翻转是一个面试中经常会碰到的题,在之前的文章中,也聊过单链表翻转、链表双双翻转...

weixin_30466329的博客 170

VASP+机器学习快速收敛AIMD

本文介绍了如何利用VASP结合机器学习技术快速收敛AIMD(从头算分子动力学)模拟。首先,通过训练机器学习力场,生成关键文件如ML_ABN(包含结构数据集)、ML_FFN(存储回归结果)和ML_LOGFILE(记录训练日志)。接着,配置INCAR文件以设置计算参数,包括并行化、分子动力学和机器学习相关参数。KPOINTS文件用于定义K点网格。计算完成后,备份CONTCAR文件作为后续模拟的初始结构。最后,利用训练好的力场文件进行纯机器学习力场分子动力学模拟,并提交任务执行。

qq_44812865的博客 1405

【Bluetooth|蓝牙开发】三、一篇文章,带你总览蓝牙协议

1、开篇词 2、蓝牙开发入门 3、蓝牙协议栈总览 4、蓝牙协议栈——物理层 5、蓝牙协议栈——链路层 6、蓝牙协议栈——传输层 7、蓝牙协议栈——L2CAP协议 8、蓝牙协议栈——ATT协议 9、蓝牙协议栈——GATT协议 10、蓝牙通信流程分析 11、蓝牙协议栈——Bluez交叉编译 12、蓝牙调试工具汇总

Donge's Blog 1万+

翻转链表喵

给你单链表的头节点head,请你反转链表,并返回反转后的链表。

m0_74376876的博客 861

【专栏必读】王道考研408计算机组成原理万字笔记使用说明及章节导航

本文是为准备408王道计算机组成原理考试的学生精心整理的万字笔记,涵盖了从计算机系统概述、数据表示和运算到存储系统、指令系统等多个章节的重点内容。本文强调了学习笔记的重要性,并分享了学习建议,如按视频课逻辑记录,建立学科框架。笔记详细记录了每章的关键知识点,包括存储器、CPU、I/O系统的工作原理,还附带了习题和思维导图,旨在帮助考生高效复习。

快乐江湖的博客 9万+

图解:K 个一组翻转链表 | LeetCode 级别:困难

题图:@Colton Sturgeon一. 序链表作为一种基本的数据结构,本身理解起来很简单。它通过指针,将一组零散的内存空间(结点),串联起来,组成一个数据结构。在面试...

承香墨影的博客 521

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 314

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

翻转链表

单链表翻转 leetcode206 递归 public ListNode reverseList(ListNode head) { if(head == null || head.next == null) return head; ListNode rever = reverseList(head.next); //1->2->3->4,此时root=...

xunboang0059的博客 174

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

从反转链表 到 K 个一组翻转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例:这张图给我一个误解是反转之后链表的存储顺序也要翻转,事实上可以理解为只反转指针就可以了,所以只需要一次遍历就可以完成,而不是需要使用双指针法两个指针分别往前移动然后交换位置。一次遍历的时候需要注意存储,这样才能把当前节点的next指向它(prev)。,prev指针也是起了一个双指针中尾指针的作用,

ZHAO__JW的博客 478

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

labuladong刷题笔记一(单链表)

快慢指针

该用户还没想到好的昵称的博客 1567

LeetCode-025-K个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/

qq_43269370的博客 177

Java将给出的链表中的节点每k个一组翻转,返回翻转后的链表

题目描述 将给出的链表中的节点每k个一组翻转,返回翻转后的链表 如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样 你不能更改节点中的值,只能更改节点本身。 只允许使用常数级的空间 例如: 给定的链表是1->2->3->4->5 对于 k= 2, 你应该返回 2->1->4->3->5 对于k= 3, y你应该返回3->2->1->4->5 public ListNode reverseKGroup...

luzhensmart的专栏 1346

reverse-nodes-in-k-group

题目:Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is

llwjason5555的博客 215

单链表翻转、k个一组进行翻转

单链表翻转、k个一组进行翻转 1. 整个单链表翻转,k个一组进行翻转,原理一样 2.假如有一个单链表:1->2->3->4->5->6->7->8 3.假如4个一组进行翻转,头结点为head 4,完整代码在最后,(k个一组,java) (1)我们令pre.next=head;保存头结点的前一个位置; (2)tail=pre;tail=tail.next循环4次找到这一组的尾巴位置,nex=tail.next保存尾巴位置的后一个位置,方便连接。 (3)现在就只需要将h

Jacgu的博客 379

LeeCode25. K 个一组翻转链表——完整步骤拆解(含注释)

本文介绍了如何实现K个一组翻转单链表的算法。首先解析了问题要求,即每连续K个节点为一组进行翻转,不足K个则保持原序。接着讲解了单链表翻转的迭代法和递归法两种基础方法。核心思路是将问题拆分为分组、翻转和连接三个步骤,通过虚拟头节点简化边界处理。给出了完整的Java代码实现,并分析了时间复杂度为O(n)和空间复杂度为O(1)。最后讨论了k=1、链表长度为k的整数倍等边界情况。该算法通过实际交换节点完成翻转,适用于各种链表长度和分组规模。

864

算法-链表

算法-链表链表单链表1.2021-4-14 指定区间单链表节点反转2.2021-4-15 K 个一组翻转链表 链表 单链表 1.2021-4-14 指定区间单链表节点反转 题目: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 输入 head = [1,2,3,4,5], left = 2, right = 4 输出 [1,4,3,2,5] 思路: 两个

pourtheworld的博客 182

LeetCode25——K个一组翻转链表(头插法)

题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,

weixin_38933749的博客 206

C++翻转链表

1 题目描述 2

向上吧贺凯 1352
上一篇: 单链表:判断链表中是否有环
下一篇: 单链表:删除链表中重复的元素
Colourful.
博客等级 码龄6年 13粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值