题目描述

给出一个链表,每 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. [jquery]如何实现页面单块DIV区域滚动展示

    // 未实现功能的代码 1(自己写的代码) var _cur_top = $(window).scrollTop(); var num = $(".class_section"). ...

  2. JavaScript中的工厂函数

    所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例. 在学习jQuery的时候,我们经常会看到“工厂函数”这个概念,那么究竟什么是“工厂函数”呢?我们来看看概念,“所 ...

  3. 解决XCode7.1 上无法安装 Alcatraz PackageManager

    补记: 升级XCode后都会出现这样的问题,各版本解决方案相同 有时还需要先删除原插件 rm -rf ~/Library/Application\ Support/Developer/Shared/X ...

  4. 【转】C#中dynamic的正确用法

    原文:http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4.0的新特性.dynamic ...

  5. PHP eval函数

    代码: eval("echo'hello world';"); 上边代码等同于下边的代码: echo"hello world"; 在浏览器中都输出:hello ...

  6. 小技巧——病毒分析中关闭ASLR

    原文来自:https://bbs.ichunqiu.com/thread-41359-1-1.html 病毒分析中关闭ASLR 分析病毒的时候,尽可能用自己比较熟悉的平台,这样可以大大地节省时间,像我 ...

  7. Spring static 静态属性注入

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> &l ...

  8. python -猜字小游戏

    代码运行效果如下: 注意: 1.必须要在python3环境想使用 2.QQ:3084276329(一起交流学习) 3.还请大家评论 Guess the word game代码如下: #! /usr/b ...

  9. 使用IST重新加入节点(5.7.20)

    IST不是SST用于节点重新加入吗?我们有解决方案! 鉴于上述痛点,我们将介绍 gcache.freeze_purge_at_seqno Percona XtraDB Cluster 5.7.20.这 ...

  10. spring + mybatis 存取clob

    存的时候会比较麻烦,需要使用select for update的方式更新数据,如果原来没有这一条数据,还需要先新增,新增的时候需要将clob字段存为oracle.sql.CLOB.empty_lob( ...