算法——K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
leetcode
利用四个指针,分别指向需要反转一段区间的头尾节点,以及头节点的前一节点,尾节点的下一节点,进行反转,不断迭代。
/**
* created by lippon
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 声明四个节点
ListNode a, b , c, d, dummy;
// 排除特殊情况
if(head == null || head.next == null || k == 1) return head;
// 实例化虚拟头节点,用于返回结果
dummy = new ListNode(0);
dummy.next = head;
// 四个节点置位
a = dummy;
b = dummy.next;
c = dummy;
d = dummy.next;
// 若末尾节点为null则退出循环
while(d != null){
// 将cd节点送到需要交换的尾部
for(int i = 0; i < k; i++){
// 不足k, 则直接返回结果
if(d == null) return dummy.next;
c = c.next;
d = d.next;
}
// 获取已经交换段的尾节点, 重新置位
a = reverse(a, b, c, d);
b = a.next;
c = a;
d = a.next;
}
// 返回头节点
return dummy.next;
}
// 交换函数,a节点的下一个节点为需要交换段的头节点, b为需要交换段的尾部节点
// 为需要交换段的尾部节点, d为需要交换段的尾节点的下一节点
public ListNode reverse(ListNode a, ListNode b, ListNode c, ListNode d){
// 双指针用于反转
ListNode i = b, j = b.next;
// 反转该段链表
while(j != d){
ListNode temp = j.next;
j.next = i;
i = j;
j = temp;
}
// 将完成交换的头尾节点连上
a.next = c;
b.next = d;
// 返回末尾节点
return b;
}
}
算法——K 个一组翻转链表的更多相关文章
- leetcode 25. K 个一组翻转链表
# coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...
- LeetCode 25. K 个一组翻转链表 | Python
25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- LeetCoded第25题题解--K个一组翻转链表--java--链表
链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- [LintCode] Reverse Nodes in k-Group 每k个一组翻转链表
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...
- k个一组翻转链表(java实现)
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
- js 之k个一组翻转链表
题目描述 将给出的链表中的节点每\ k k 个一组翻转,返回翻转后的链表如果链表中的节点数不是\ k k 的倍数,将最后剩下的节点保持原样你不能更改节点中的值,只能更改节点本身.要求空间复杂度 \ O ...
- [LeetCode]25. Reverse Nodes in k-Group k个一组翻转链表
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...
随机推荐
- linux文件增删拷(touch/mkdir/cp/mv/rm)
touch或>命令创建普通文件: [root@localhost test]# touch a ---创建单个文件 [root@localhost test]# ls a [root@loca ...
- DOM XSS详解
DOM XSS简介 DOM XSS与反射性XSS.存储型XSS的主要区别在于DOM XSS的XSS代码不需要服务端解析响应的直接参与,触发XSS的是浏览器端的DOM解析. DOM XSS复现 环境搭建 ...
- CTF-流量分析笔记
---恢复内容开始--- 前言 做流量分析很长时间了但是一直没有系统的去总结过这类题目的做法和思路以及wireshark的使用方法,这次做题的时候突然发现了一个总结的特别好的博客,因此想趁机做个笔记总 ...
- 如何使用ABBYY FineReader 处理无法识别的字符?
在识别PDF文档时,我们可能会遇到文档中存在多种语言.多种不同类型文字字符的情况.在ABBYY FineReader 15(Windows系统)OCR文字识别软件的默认语言数据下,可能无法识别PDF文 ...
- 永别了,Dota2!
永别了,Dota2 .输了游戏,我还有人生! 游戏中,总有那些喷子,自己玩的不好,经常说人家! 和大便打架,即使赢了,身上也非常臭! 所以对于这种人,敬而远之即可!不吵不闹,默默把锅扛起!赢了,就好说 ...
- Forethought Future Cup - Final Round (Onsite Finalists Only) C. Thanos Nim 题解(博弈+思维)
题目链接 题目大意 给你n堆石子(n为偶数),两个人玩游戏,每次选取n/2堆不为0的石子,然后从这n/2堆石子中丢掉一些石子(每一堆丢弃的石子数量可以不一样,但不能为0),若这次操作中没有n/2堆不为 ...
- Java基础教程——安装JDK
视频讲解:https://www.bilibili.com/video/av48196406/?p=3 使用[jdk-8u144-windows-x64.exe] 下载地址: 链接:https://p ...
- Java里的数组降序
Java升序容易,降序不易. 基本类型不能降序,至少要是包装类. 升序使用Arrays.sort() 降序要么使用Collections.reverse,要么实现Comparator接口 import ...
- limit+orderBy陷阱
碰到一个奇怪的bug,在排序的时候对一个非唯一的字段做order by, 结果在分页的时候,发现每一页的数据都是乱的,并不是对整个排序之后再去limit的. 当我们用唯一字段去排序的时候,因为在找到满 ...
- [BUGCASE]Webpack打包报JavaScript堆内存泄漏的错误
一.问题描述 执行npm run build之后报错: 报错信息: FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript he ...