题目描述

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

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

算法

边界条件

  1. k值与链表长度。虽然题目说k 是一个正整数,它的值小于或等于链表的长度。但是实际提交的时候我发现。。。没错,k值大于链表长度也被作为一个测试点。

  2. 链表为空或者k值为1

思路

  1. 找到两个距离为k的节点
  2. 反转两个节点之间的这段链表
  3. 重复1、2步直到遍历完整个链表

代码

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* global_head;
ListNode* reverseKGroup(ListNode* head, int k) { // 边界条件
if(head == NULL || k == 1)
return head;
int size = 0;
for(ListNode* t = head; t; t = t->next, size++);
if(size < k)
return head; /*** H靠近链表头部,tail靠近链表尾部;
pre_node定义为前一段已经反转的局部链表的最后一个节点;
比如链表1->2->3->4->5->6,k=2;第一段局部链表反转为2->1,那么pre_node指向1这个节点;
pre_node初值设为NULL,可以在reverse_k中判断是不是第一段局部链表的反转,如果是第一段的话,需要设置反转后的链表头部节点global_head
***/
ListNode *H, *tail, *pre_node = NULL;
H = tail = head; // 遍历整个链表
while(true)
{
// cnt用来记录H和tail节点之间的距离,
int cnt = 0;
while(cnt < k && tail != NULL)
{
tail = tail->next;
cnt++;
} // 1->2->3,k=3
if(tail == NULL && cnt == k)
{
reverse_k(pre_node, H, tail);
break;
}
// 最后剩余节点不足k个
else if(cnt != k)
{
pre_node->next = H;
break;
}
// 对k个节点反转
else
{
reverse_k(pre_node, H, tail);
H = tail;
}
}
return global_head;
} void reverse_k(ListNode *&pre_node, ListNode *&start, ListNode *&end) { /*** 这个函数将[start, end)之间的节点顺序逆置 ***/ ListNode *pre, *p, *post;
pre = start;
p = pre->next;
// 反转代码
while(p != end)
{
post = p->next;
p->next = pre;
pre = p;
p = post;
}
// 判断是不是第一段局部链表的反转以设置改动后的链表头节点global_head
if(pre_node == NULL)
global_head = pre;
else
// pre_node是前一段链表的最后一个节点,接上这段链表
pre_node->next = pre; // 重新设置pre_node为这段链表的最后一个结点
pre_node = start;
pre_node->next = NULL;
}
};

25. k个一组翻转链表的更多相关文章

  1. leetcode 25. K 个一组翻转链表

    # coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...

  2. LeetCode 25. K 个一组翻转链表 | Python

    25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...

  3. Java实现 LeetCode 25 K个一组翻转链表

    25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...

  4. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  5. [LeetCode] 25. k个一组翻转链表

    题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...

  6. Leetcode题库——25.k个一组翻转链表

    @author: ZZQ @software: PyCharm @file: ReverseList.py @time: 2018/11/6 15:13 题目要求:给出一个链表,每 k 个节点一组进行 ...

  7. LeetCode 25 —— K 个一组翻转链表

    1. 题目 2. 解答 首先,利用快慢指针确定链表的总结点数. 偶数个结点时,结点个数等于 i * 2. 奇数个结点时,结点个数等于 i * 2 + 1. 然后将链表的每 K 个结点划分为一组.循环对 ...

  8. [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)

    https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...

  9. LeetCode 25. k个一组翻转链表(Reverse Nodes in k-Group)

    题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...

随机推荐

  1. Ubuntu12.04搭建自有源

    其实,这个工作比较简单,主要两步:apt-mirror和apache.(这里的系统是ubuntu12.04) 1.apt-mirror 1.1 安装 一如既往地简单,直接sudo apt-get in ...

  2. centos7 搭建WEB服务器

    centos7 搭建WEB服务器 2017年09月17日 09:44:50 逝然1994 阅读数:18321 标签: centosapacheweb服务器 更多 个人分类: centos服务器简单配置 ...

  3. [leetcode 12] Inter to Roman

    1 题目: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range fr ...

  4. jquery基于form-data文件上传

    1.html代码 <input type="file" name="myupdate" id="myupdate"> 2.jav ...

  5. c# file 上传EXCEL文件,以流的形式读取数据

    1.引入  Aspose.Cells public void test() { HttpFileCollection filelist = HttpContext.Current.Request.Fi ...

  6. C# webservice服务跟踪调试方法(转)

    1.新建网站,添加服务,并创建服务. 2.打开internet 信息服务管理器,添加网站,映射到创建的服务所在网站的目录. 3.打开服务所在网站的解决方案,进行配置. 1) 设置启动选项 选择启动操作 ...

  7. ZedGraph设置辅助线

    ZedGraph设置辅助线 1.一般来说ZedGraph设置参考线可以用 ZedGraph对象.YAxis.MajorGrid.IsVisible = True '水平参考线 ZedGraph对象.X ...

  8. Akka(42): Http:身份验证 - authentication, authorization and use of raw headers

    当我们把Akka-http作为数据库数据交换工具时,数据是以Source[ROW,_]形式存放在Entity里的.很多时候除数据之外我们可能需要进行一些附加的信息传递如对数据的具体处理方式等.我们可以 ...

  9. Java实时监控类库Metrics

    随着系统越来越大,越来越复杂,我们需要在业务方面加上一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使用Metrics 使用Metrics,只 ...

  10. js转换数据格式为货币格式

    有时候输资金数据的时候如果位数较多就不好读了,如果输完能转换一下格式,转成用“,”隔开的通用格式就比较好看了.自己写了一个备用,以后用到的话就不用再写了. //将数字转换为货币格式,用,隔开 func ...