LeetCode-25:K 个一组翻转链表
题目描述:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
思路分析:
步骤分解:
- 链表分区为已翻转部分+待翻转部分+未翻转部分
- 每次翻转前,要确定翻转链表的范围,这个必须通过 k 此循环来确定
- 需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来
- 初始需要两个变量 pre 和 end,pre 代表待翻转链表的前驱,end 代表待翻转链表的末尾
- 经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next
- 翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end 指针,然后进入下一次循环
- 特殊情况,当翻转部分长度不足 k 时,在定位 end 完成后,end==null,已经到达末尾,说明题目已完成,直接返回即可
时间复杂度为 O(n*K), 最好的情况为 O(n), 最差的情况未 O(n^2)O
空间复杂度为 O(1),除了几个必须的节点指针外,我们并没有占用其他空间。
java实现:
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null){return head;}//定义一个假的节点。ListNode dummy=new ListNode(0);//假节点的next指向head。// dummy->1->2->3->4->5dummy.next=head;//初始化pre和end都指向dummy。pre指每次要翻转的链表的头结点的上一个节点。end指每次要翻转的链表的尾节点ListNode pre=dummy;ListNode end=dummy;while(end.next!=null){//循环k次,找到需要翻转的链表的结尾,这里每次循环要判断end是否等于空,因为如果为空,end.next会报空指针异常。//dummy->1->2->3->4->5 若k为2,循环2次,end指向2for(int i=0;i<k&&end != null;i++){end=end.next;}//如果end==null,即需要翻转的链表的节点数小于k,不执行翻转。if(end==null){break;}//先记录下end.next,方便后面链接链表ListNode next=end.next;//然后断开链表end.next=null;//记录下要翻转链表的头节点ListNode start=pre.next;//翻转链表,pre.next指向翻转后的链表。1->2 变成2->1。 dummy->2->1pre.next=reverse(start);//翻转后头节点变到最后。通过.next把断开的链表重新链接。start.next=next;//将pre换成下次要翻转的链表的头结点的上一个节点。即startpre=start;//翻转结束,将end置为下次要翻转的链表的头结点的上一个节点。即startend=start;}return dummy.next;}//链表翻转// 例子: head: 1->2->3->4public ListNode reverse(ListNode head) {//单链表为空或只有一个节点,直接返回原单链表if (head == null || head.next == null){return head;}//前一个节点指针ListNode preNode = null;//当前节点指针ListNode curNode = head;//下一个节点指针ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一个节点,保存当前节点后面的链表。curNode.next=preNode;//将当前节点next域指向前一个节点 null<-1<-2<-3<-4preNode = curNode;//preNode 指针向后移动。preNode指向当前节点。curNode = nextNode;//curNode指针向后移动。下一个节点变成当前节点}return preNode;}}
LeetCode-25:K 个一组翻转链表相关推荐
- LeetCode 25. K 个一组翻转链表
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 难度:困难 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. ...
- Leetcode 25.K个一组翻转链表
难度:困难 频率:185 **题目:**给你一个链表,每K个节点一组进行翻转,清你返回翻转后的链表. K是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是K的整数倍,那么请将最后胜于的节点保 ...
- 28. Leetcode 25. K 个一组翻转链表 (链表-反转链表)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一 ...
- Leetcode 25 K个一组翻转链表 (每日一题 20210719)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表.k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序.进阶:你可以设计一个只 ...
- LeetCode 25 K个一组翻转链表
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 解决方案 class Solution {public ListNode reve ...
- 25. K 个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- Leetcode-递归/反转链表模板-25. K 个一组翻转链表
题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...
- 【每日算法/刷穿 LeetCode】25. K 个一组翻转链表(困难)
题目描述 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例: ...
- leetcode C++ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
一.思路: 先实现两个节点翻转,再实现k个节点翻转,最后实现一组一组翻转 二.C++代码: class Solution { public:ListNode* swap(ListNode *f1, L ...
- leetcode 25. Reverse Nodes in k-Group | 25. K 个一组翻转链表(Java)
题目 https://leetcode.com/problems/reverse-nodes-in-k-group/ 题解 乍一看以为很容易:每 k 个节点翻转,若剩余不足 k 个,则不变.没有什么技 ...
最新文章
- leetcode算法题--栈的压入、弹出序列
- 一款可视化的在线制作H5
- 记住北京历史上的灾难
- 解决<style>无法重写.css文件的问题
- c得到当前时分秒 linux_Linuxc - Linux系统下的时间知识点
- sizeof(string)
- mysql galera status_MySQL galera cluster集群的监控
- Java笔记-通过反射获取枚举类型中所有数据
- 漫步最优化二十八——三次插值法
- 前端:HTML/03/超级链接,绝对地址URL,相对地址URL,特殊链接
- 推荐一款UI非常Good的 Redis 客户端工具
- 安卓kotlin教程
- Rediskey的基本操作
- nginx参数keepalive_timeout
- python聊天小程序支持私聊和多人_Python 使用 django 框架实现多人在线匿名聊天的小程序...
- List 接口中扩充的 10 个方法详解
- 【水题】hzy 和zsl 的生存挑战
- 安徽科技学院 信网学院网络文化节 孙晓楠
- IBDP tok课程是什么课?怎么拿高分?
- 基于Ubuntu 16.04的HUSTOJ在线判题系统的搭建