1. 题目

2. 解答

  • 首先,利用快慢指针确定链表的总结点数。

  • 偶数个结点时,结点个数等于 i * 2。

  • 奇数个结点时,结点个数等于 i * 2 + 1。

  • 然后将链表的每 K 个结点划分为一组。循环对每组的子链表进行翻转,并依次拼接起来。

  • 最后,将多余的结点拼接在新链表最后面即可。

  • 代码如下

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* reverseKGroup(ListNode* head, int k) {
  12. if (head == NULL || head->next == NULL || k == 1) //空链表或只有一个结点或者 k=1 不用翻转,直接返回
  13. {
  14. return head;
  15. }
  16. else
  17. {
  18. int node_num = 0; // 链表的结点个数
  19. ListNode* slow = head;
  20. ListNode* fast = head;
  21. // 利用快慢指针确定链表的结点总个数
  22. while(fast && fast->next)
  23. {
  24. slow = slow->next;
  25. fast = fast->next->next;
  26. node_num++;
  27. }
  28. if (fast) // 奇数个结点
  29. {
  30. node_num = node_num * 2 + 1;
  31. }
  32. else // 偶数个结点
  33. {
  34. node_num = node_num * 2;
  35. }
  36. int reverse_time = node_num / k; // 需要翻转链表的次数
  37. // 链表结点数小于 k,不需要翻转链表
  38. if (reverse_time == 0)
  39. {
  40. return head;
  41. }
  42. else
  43. {
  44. ListNode* temp = head; // 保存链表的头结点
  45. ListNode* tail = head; // 翻转后子链表的尾结点
  46. ListNode* p1 = head;
  47. ListNode* p2 = head;
  48. ListNode* p3 = NULL;
  49. for (int i = 0; i < reverse_time; i++)
  50. {
  51. p2 = p2->next;
  52. // 进行 k-1 次翻转
  53. for (int j = 0; j < k-1; j++)
  54. {
  55. p3 = p2->next;
  56. p2->next = p1;
  57. p1 = p2;
  58. p2 = p3;
  59. }
  60. if (i == 0)
  61. {
  62. temp = p1; // 第一轮翻转,temp 指向翻转后的新链表的头结点
  63. }
  64. else
  65. {
  66. tail->next = p1; // 连接翻转后的子链表
  67. }
  68. tail = head; // 指向翻转后的新链表的尾结点
  69. head = p2; // 指向后面待翻转链表的第一个结点
  70. p1 = p2;
  71. }
  72. tail->next = head; // 连接多余的结点
  73. return temp;
  74. }
  75. }
  76. }
  77. };

获取更多精彩,请关注「seniusen」!

LeetCode 25 —— K 个一组翻转链表的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    LeetCode 25 k组一个翻转链表 TITLE 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3, ...

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

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

随机推荐

  1. CSS选择器种类及使用方法

    css选择器 有通配符选择器书写格式:*+{声名块} 并集选择器/组合选择器 书写格式;元素或类或id+""+元素或类或id+","+元素或类或id{声明块} ...

  2. Docker官方文档翻译1

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 本系列教程翻译于docker文档,文档地址:http ...

  3. ios学习路线—Objective-C(堆(heap)和栈(stack))

    Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数的话就 ...

  4. excel导入到java/导出到excel

    package com.test.order.config; import com.test.order.domain.HavalDO; import org.apache.poi.ss.usermo ...

  5. Vue--- mint-UI 穿插

    Vue-mint-UI库 概述:就是一个 封装好的库 安装/下载:npm install  --save mint-ui 常用 1) Mint UI:a. 主页: http://mint-ui.git ...

  6. Floyd 算法详解

    Floyd-Warshall Floyd算法,是一种著名的多源最短路算法. 核心思想: 用邻接矩阵存储图,核心代码为三重循环,第一层枚举中间点k,二三层分别枚举起始点i与目标点j.然后判断经过中间点k ...

  7. 爬虫——正则表达式re模块

    为什么要学习正则表达式 实际上爬虫一共就四个主要步骤: 明确目标:需清楚目标网站 爬:将所有的目标网站的内容全部爬下来 取:在爬下来的网站内容中去掉对我们没有用处的数据,只留取我们需要的数据 处理数据 ...

  8. 转:java中的定时任务

    引自:http://www.cnblogs.com/wenbronk/p/6433178.html java中的定时任务, 使用java实现有3种方式: 1, 使用普通thread实现 @Test p ...

  9. 解决url传递过程中加号变空格的问题

    url传递过程中加号变空格 在接收url参数的过程中,会发现如果参数中存在‘+’号,接收后会变成空格. 如11+22接收后变成11 22. 要解决这个问题,需要将加号替换为%2B进行传递. 如11%2 ...

  10. laravel 中出现SQLSTATE[HY000] [2002] 如何解决?

    在日常开发中总是难免遇到各式各样的错误,还有许多错误常常是重复出现的 以下是报错信息! SQLSTATE[HY000] [2002] ������ӷ���һ��ʱ���û���ȷ�