以k个元素为一组反转单向链表

链表反转,链表内指定区间反转,链表中的元素每k个一组进行翻转思路分析及代码 1.反转链表 问题描述:给定一个单链表的头结点pHead(该头节点是有值的它的val是1),长度为n,反转该链表后,返回新链表的表头。 思路分析:拿到题目看到方法的参数为单链表的头节点,如果头节点为null或者头节点的下一个节点为空则不用反转直接返回头节点即可;如果这两者都不为空那么需要从第二个节点开始依次使用头插法对链表进行修改,由于每次在链表头插入元素的时候需要改变该元素的下一个节点指向头节点这样就会导致后面的节点丢失,所有在插入前,需要定义一个新节点用于保存下一个节点。(注意:反转链表时,原来. 阅读详情

问题:

以k个元素为一组,反转单向链表。比如:

输入: 1->2->3->4->5->6->7->8->null and k = 3

输出:3->2->1->6->5->4->8->7->null. 

分析:

我们可以把整个链表分成多个长度为 k  的子链表, 然后,我们再反转每一个子链表(递归)。问题的关键是我们需要把每个子链表再连接起来。所以,对每一个子链表操作以后,我们需要返回该子链表的头(head),然后,我们设置前一个子链表的最后一个node,把它的next 设置成下一个链表返回的头(head),这样,所有的子链表就连接起来了。

public static Node reverse (Node head, int k) {
	Node current = head;
	Node next = null;
	Node prev = null;
    int count = 0;   
    
    /*reverse first k nodes of the linked list */
    while (current != null && count < k) {
       next  = current.next;
       current.next = prev;
       prev = current;
       current = next;
       count++;
    }
 
    /* next is now a pointer to (k+1)th node
       Recursively call for the list starting from current.
       And make rest of the list as next of first node */
    if(next !=  null) {
    	head.next = reverse(next, k); 
    }
 
    /* prev is new head of the input list */
    return prev;
}

这个问题也可以使用非递归的方法,基本上问题的处理方式和递归是一样的,但是,非递归的方式要稍微复杂一点,因为每次对子链表反转以后,我们需要更新前一个子链表最后一个node 的next 值。代码如下:

class Node {
     int val;
     Node next;
     Node(int x) {
         val = x;
         next = null;
     }
}

public class Solution {
	
	public static void main(String[] args) {
		Solution s = new Solution();
		
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);
		Node n4 = new Node(4);
		Node n5 = new Node(5);
		
		n1.next = n2;
		n2.next = n3;
		n3.next = n4;
		n4.next = n5;
		
		Node head = s.ReverseInGroups(n1, 2);
		while (head != null) {
			System.out.println(head.val);
			head = head.next;
		}
	}
	public Node ReverseInGroups(Node current, int k) {
		if (current == null || current.next == null ) return current;
		//store the new head of the list
		Node newHead = null;
		
		//store the last node in the sub-list, 
		//we will update its next value when finishing
		//reversing the next sub-list
		Node previousGroupTail = null;
		int count = 1; //used to track the first sub-list
	    while (current != null) {	
	    	// the actual tail in the sub-list
	    	Node groupTail = current;
	    	//reverse
	    	Node prev = null;
	    	Node next = null;
	    	for (int i = 1; i <= k && current != null; i++) {
	            next = current.next;
	            current.next = prev;
	            prev = current;
	            current = next;
	        }
	        // get the new head of the whole list
	    	if (count == 1) {
	    		newHead = prev;
	    		count++;
	    	}
	    	// update the next value of the last node in
	    	// each sub-list
	    	if (previousGroupTail != null) {
	    		previousGroupTail.next = prev;
	    	}
	    	previousGroupTail = groupTail;
	    }
	    return newHead;
	}
}

参考:http://www.geeksforgeeks.org/archives/8014

转载请注明出处:http://blog.youkuaiyun.com/beiyetengqing





随笔-每k个节点反转链表(高效解法) 题目:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。 示例 : 给定这个链表:1-&gt;2-&gt;3-&gt;4-&gt;5 当 k = 2 时,应当返回: 2-&gt;1-&gt;4-&gt;3-&gt;5 当 k = 3 时,应当返回: 3-&gt;2-&gt;1... 阅读详情

相关推荐

电子纸价签实战:基于SSD1680的墨水屏驱动开发与优化

本文详细介绍了基于SSD1680驱动芯片的电子纸价签开发实战,涵盖硬件连接、驱动框架搭建、核心流程解析及性能优化。重点剖析了初始化配置、波形文件加载、图像数据写入与刷新触发等关键步骤,并提供了功耗优化、显示效果提升及代码健壮性等实用避坑指南,帮助开发者高效实现稳定低功耗的墨水屏驱动。

weixin_28278377的博客 231

K个一组翻转链表

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

乐只悠悠 3523

音频质量评估指标全解析:从主观到客观的全面指南

本文全面解析了音频质量评估的核心指标,涵盖主观评价(如MOS、DMOS)与客观评价(如PESQ、STOI、SDR)。重点介绍了DNSMOS等AI驱动的无参考评估方法,并提供了根据语音通信、噪声抑制、语音分离等不同场景选择指标组合的实战指南,帮助开发者和研究者科学量化音频质量。

rum55的博客 645

面试经典算法系列之链表4-- K个一组反转链表

公众号:阿Q技术站。

qq_44630255的博客 1725

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

2026年沐曦集成电路数字IC笔试试卷带答案

本文摘要: 这是一份数字IC设计笔试模拟题,包含单选题、波形分析、多选题和代码设计题。重点考察ASIC设计流程(如逻辑综合将RTL转为门级网表)、时序分析(建立时间余量计算)、跨时钟域处理(格雷码应用)、复位机制、状态机设计等核心知识点。涉及沐曦特色考点如GPU架构(SIMT模型)、国产GPU芯片(曦云C系列)及MXMACA软件栈。代码题要求实现50%占空比三分频电路,综合考察Verilog设计能力。试题强调PPA优化、低功耗技术等工程实践要点,覆盖数字IC前端设计全流程核心内容。(149字)

Open 260

递归下降分析法的基本思想。_递归思维:k个一组反转链表

读完本文,你可以去力扣拿下如下题目:25.K个一组翻转链表-----------之前的文章「递归反转链表的一部分」讲了如何递归地反转一部分链表,有读者就问如何迭代地反转链表,这篇文章解决的问题也需要反转链表的函数,我们不妨就用迭代方式来解决。本文要解决「K 个一组反转链表」,不难理解:这个问题经常在面经中看到,而且 LeetCode 上难度是 Hard,它真的有那么难吗?对于基本数据结构的算法问题...

weixin_39830012的博客 520

数据结构与算法——k个一组反转链表

k个一组反转链表

MiauwYuki的博客 1864

把 LDB 讲透:SAP ABAP 逻辑数据库的结构、事件模型、动态选择与现代替代方案

摘要:SAP中的Logical Database(LDB)是一种将表组织成树形结构并统一生成选择屏幕的技术,通过事件驱动方式向报表程序传递数据。虽然被标记为过时,但在理解标准代码和优化性能方面仍有价值。LDB通过SE36事务码创建,其结构包含层级关系、选择屏幕和数据库程序。报表通过NODES声明和GET事件处理数据,支持动态选择以减少数据库访问。在S/4HANA和ABAP Cloud环境下,建议使用CDS View和ABAP SQL等现代方案替代LDB,以提升可测试性和架构清晰度。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 216

Windows Docker + RK3588 部署 YOLO26-Pose 人体姿态检测

YOLO26-Pose 在 RK3588 上的部署流程是 Windows Docker 容器内 ONNX 导出 → RKNN 转换(INT8 量化)→ ADB 推送 → 板端 C++ 推理。YOLO26n-Pose 在 640 输入下全链路约 55 FPS,可以覆盖实时姿态检测需求。先在板端用单张图片验证关键点输出正确性,确认 C++ 后处理的解析逻辑无误后,再切换到摄像头实时推理。

m0_64661770的博客 98

LeetCode 25:K 个一组翻转链表

给定链表头节点head和整数k,要求k,不足k个的节点保持原序。k。

m0_75126572的博客 1204

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

1074 Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K ...

ysq96的博客 328

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[Leetcode] 高频题汇总 —— 链表

前言 链表是一种常见的线性数据结构。对于单向链表,每个节点有一个 nextnextnext 指针指向后一个节点,还有一个成员变量用以存储数值;对于双向链表,还有一个 prevprevprev 指针指向前一个节点。与数组类似,搜索链表需要 O(n)O(n)O(n) 的时间复杂度,但是链表不能通过常数时间读取第 kkk 个数据。链表的优势在于能够以较高的效率在任意位置插入或删除一个节点。 解题思路 ...

chinanfsk的博客 1867

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【leetcode】25 K 个一组翻转链表(链表)

题目链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 【hard】 题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表:1->2->3->4-...

zjwreal 147

[链表] [JAVA]一文让你真正弄懂链表

前言: 我认为数据结构是算法的基础,数组和链表就是数据结构的基础啦。哈哈哈,神马逻辑。这篇文章我们就来讲解一下链表。 什么是链表 链表是物理存储单元上非连续的、非顺序的存储结构,它是由一个一个结点,通过指针来联系起来的,其中每个结点包括数据和指针。 链表是非连续的,非顺序的,对应数组的连续、顺序,在内存中之怎样联系起来的呢? 先看一看数组在内存中的表示。 可以看到数组的每个元素都是连续紧邻分配...

qq_39397165的博客 345

LeetCode 25. K 个一组翻转链表

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

yleave的博客 229

笔记---K个一组链表反转(java)

head` 表示要反转的子链表的起始节点,`tail` 表示要反转的子链表的终止节点。该方法返回一个包含两个 `ListNode` 类型的数组,其中第一个元素是反转后的子链表的尾节点,第二个元素是反转后的子链表的头节点。这时,`prev` 已经变成了反转后的子链表的尾节点,`p` 变量则指向反转后的子链表的最后一个节点(也是原子链表的首个节点)。1. 首先,初始化一个 `ListNode` 类型的变量 `prev`,并将它的值设置为 `tail` 的下一个节点。如果小于 k,则直接返回反转后的头结点。

2302_79014065的博客 2276

链表反转,指定区间反转,k个一组反转---详解

链表操作

1900的博客 2606

链表题目:K 个一组反转链表

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析 题目 标题和出处 标题:K 个一组反转链表 出处:25. K 个一组反转链表 难度 4 级 题目描述 要求 给你一个链表,每 k\texttt{k}k 个结点一组进行反转,并返回反转后的链表。 k\texttt{k}k 是一个正整数,它的值小于或等于链表的长度。如果结点总数不是 k\texttt{k}k 的倍数,那么请将最后剩余的结点保持原有顺序。 不能修改结点的值,只能修改结点本身。 示例

stormsunshine的博客 1810

初学者练习代码准备机试(六)反转链表Ⅰ、Ⅱ,k个一组翻转链表

大家好,今天我学习了灵神的第六节课,内容是反转链表的两道题和k个一组翻转链表,感兴趣的小伙伴就看下去吧!

2301_77456778的博客 1557

如何 K 个一组反转链表

思路: 这个问题经常在面经中看到,而且力扣上难度是 Hard,它真的有那么难吗? 对于基本数据结构的算法问题其实都不难,只要结合特点一点点拆解分析,一般都没啥难点。下面我们就来拆解一下这个问题。 一、分析问题 首先,前文学习数据结构的框架思维提到过,链表是一种兼具递归和迭代性质的数据结构,认真思考一下可以发现这个问题具有递归性质。 什么叫递归性质?直接上图理解,比如说我们对这个链表调用reverseKGroup(head, 2),即以 2 个节点为一组反转链表: 如果我设法把前...

qq_45905045的博客 2365

K个一组反转链表

链表如下: head -> 1, tail -> 8 1 -> 2 -> 3 -> 4 ->5 -> 6 -> 7 -> 8-> nullptr K = 3 => 1 -> 2 -> 5 -> 4 -> 3 -> 8 -> 7 -> 6 -> nullptr (最后一部分小于K, 则不用再反转) K = 4 => 4 -> 3 -> 2 -> 1 -> 8 -

葡萄老君 676

K个一组反转链表(Java尾插法实现)

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 示例: 给你这个链表:1->2->3->4->5 当 k = 2 时,应当返回: 2->1->4->3->5 当 k = 3 时,应当返回: 3->2->1->4->5 方法一:尾插法 思路:每组k个元素,需要将前k-1个元素依次插入到第k个元素的末尾以达

weixin_43842753的博客 1081
上一篇: 使用递归和非递归方式反转单向链表
下一篇: 在O(1)平均时间删除链表结点
beiyetengqing
博客等级 码龄14年 148粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值