网站首页 > 精选教程 正文
描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表 如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样 你不能更改节点中的值,只能更改节点本身。
数据范围:2000 0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 10000≤val≤1000 要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k = 2k=2 , 你应该返回 2→1→4→3→5
对于 k = 3k=3 , 你应该返回 3→2→1→4→5
题目分析
我们可以将前k个长度的链表作为一个单独的链表,然后将之后的链表作为一个链表,这样我们便可以先翻转前k个长度的链表,然后再翻转后面的链表,最后将这两个链表连接起来,这么一看,后面的链表依旧在重复着链表的链表的翻转过程,因此可以使用递归的方式来翻转链表
代码实现
每k个长度的节点当做一个独立的链表,这样,我们便可以使用双指针的形式翻转这个独立的链表,然后将新的链表连接起来就行
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// 不需要翻转的条件
if (head == null || k <= 1) {
return head;
}
ListNode kNode = head;
// 找到kNode
for (int i = 0; i < k - 1; i++) {
kNode = kNode.next;
// 链表长度不足k,不翻转
if(kNode == null) {
return head;
}
}
// 剩下链表的头结点
ListNode nextHead = kNode.next;
// 断开链表,将前k个链表变成独立的链表
kNode.next = null;
// 翻转链表的薪的头节点
ListNode newHead = reverse(head);
// 此时的head变成了k链表的tail,reverseKGroup返回的是剩余链表翻转后的头节点,
// 将尾节点和剩余链表返回的头结点连接起来,则构成了新的链表
head.next = reverseKGroup(nextHead, k);
// 返回新链表的头节点
return newHead;
}
/**
* 翻转单个链表
*/
public ListNode reverse(ListNode head) {
if(head == null) {
return head;
}
// 采用双指针翻转链表
ListNode prev = head;
ListNode current = head.next;
// 断开head和next,防止形成环
head.next = null;
while(current != null) {
// 获取下一个node
ListNode next = current.next;
// 将current的next指向prev,进行链表翻转
current.next = prev;
// 移动双指针
prev = current;
current = next;
}
// 此时current指向null,prev变成翻转链表的head
return prev;
}
}
算法需要练习才能掌握精髓,附上算法练习地址,有需要的小伙伴可以上去练习一下
链表中的节点每k个一组翻转_牛客题霸_牛客网
注:牛客网上的算法题按照专题分类,更适合突击训练使用
- 上一篇: Java面试高频算法题总结:从入门到精通
- 下一篇: HashMap 这套八股,不得背个十来遍?
猜你喜欢
- 2025-05-14 全网讲解最透彻:HashMap&ConcurrentHashMap总结 等你来看
- 2025-05-14 Python | Leetcode链表系列(上篇)
- 2025-05-14 为了面试字节跳动后端开发岗(Java)鬼知道我经历了什么..
- 2025-05-14 java面试必备:七个常见的Java算法问题和示例答案
- 2025-05-14 1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了
- 2025-05-14 java八股文(值得收藏)
- 2025-05-14 Android高级/资深面试题
- 2025-05-14 图解 LeetCode 算法汇总——链表
- 2025-05-14 Python 切片:让你轻松玩转序列数据的“魔法剪刀”
- 2025-05-14 数据结构:单链表算法题,常见技巧套路心得分享
你 发表评论:
欢迎- 06-30【AI绘永昌】风景篇(二)(永昌图文)
- 06-30AI风景建筑图集(ai景观平面图)
- 06-30AI绘制精美绚丽的景色(ai绘制图案)
- 06-30AI风景,不存在的地方又增加了(ai风景插画作品)
- 06-301 分钟解锁!运用 DS + 即梦 + 豆包,轻松打造个性化风景音乐短视频
- 06-30美景欣赏 #AI绘画#(美景图画)
- 06-30AI动漫风景图集1 ~(ai动漫图片)
- 06-30原图壁纸,ai绘画风景(原图壁纸下载)
- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)