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

示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

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

思路:先把是不是从头开始区分一下,然后每一次翻转之前,都要判断数量够不够k

#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; ListNode* createlist(int n)//生成链表
{
if (n == ) return nullptr;
ListNode* head = (ListNode*)malloc(sizeof(ListNode));
cin >> head->val;
ListNode* pre = head;
for (int i = ; i < n - ; i++)
{
ListNode* p = (ListNode*)malloc(sizeof(ListNode));
cin >> p->val;
pre->next = p;
pre = pre->next;
}
pre->next = nullptr;
return head;
} ListNode* reverselist(ListNode* head, ListNode *p, int k)
{
int tk = k;//暂时保存k的值
if (head == p)//是头
{
ListNode* temp = head;//
ListNode* endd = head;//
ListNode* ttemp=nullptr;
ListNode* pre = nullptr;//保存已反转的下一个
ListNode* end = nullptr;//
ListNode* t = head;//保存反转过的最后一个
while (tk > )//说明从头节点开始有K个节点可供反转
{
if (temp != nullptr)
{
temp = temp->next;
tk--;
}
else
return head;
}//while循环后temp指针指向链表的第K+1个节点
//cout<<temp->val<<endl;
//开始反转,让头指向空
pre = head->next;
head->next = nullptr;
//cout<<temp->val<<endl;
while (pre != temp)
{
//t = pre;
end = pre->next;
pre->next = head;
head = pre;
pre = end;
}
//cout << t->val << endl;
endd->next = temp;//连接后面剩下的
//带头的前k个处理完了,判断接下来的够不够k个
tk = k;
//temp = t;
while (tk != )//是否可继续处理
{
if (temp != nullptr)
{
temp = temp->next;
tk--;
}
else
return head;
}
//cout << t->val <<t->next->val<< endl;
//cout << head->val << head->next->val << endl;
reverselist(head, t, k);//够的话就递归反转
}
else
{
ListNode* pre = p;//保存已经反转过的最后一个--------------------
ListNode*cur = pre->next;//保存待反转的第一个
ListNode* cur_next=cur->next ;//保存待反转的下一个
ListNode* end = nullptr;//存放待反转的最后一个节点的下一个节点----------------------
ListNode* thead=nullptr;//存放转后的头节点---------------
ListNode* tcur = cur_next->next;//存放当前的cur_next的下一个节点,即下次要反转的那个------------------
ListNode* temp = nullptr;//记录反转的链表尾
ListNode* t = nullptr;//
//-----------------------------先反转第一次 cur_next->next = cur;
cur->next = nullptr;
temp = cur;
thead = cur_next;
tk = k-;
while (tk > )
{
cur = tcur;
tcur = tcur->next;
cur->next = thead;
thead = cur;
tk--;
}
pre->next = thead;
temp->next = tcur;
t = temp->next;
//带头的前k个处理完了,判断接下来的够不够k个
tk = k;
//temp = t;
while (tk != )//是否可继续处理
{
if (t != nullptr)
{
t = t->next;
tk--;
}
else
return head;
}
reverselist(head, temp, k);//够的话就递归反转
}
return head;
} ListNode* reverseKGroup(ListNode* head, int k) {
if (head == nullptr || k == || k == ) return head;
ListNode *temp = head;
head = reverselist(head, head, k);
return head;
} int main() {
ListNode* head = createlist();
ListNode*ans = reverseKGroup(head, );
while (ans != nullptr)
{
cout << ans->val << endl;
ans = ans->next;
}
return ;
}

#leetcode刷题之路25- k个一组翻转链表的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

    题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 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 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...

  10. [LeetCode] 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 ...

随机推荐

  1. 在IE、fixfox、chrome等浏览器中ajax提交成功后,打开新标签页面被浏览器拦截问题[转]

    如题: 在项目中要在当前页面中,再新开一个页面, 新开页面的地址是ajax请求后返回的url --------- 试了,浏览器提示组织弹窗..... 网上找,找到了一个处理方式,思路是 1. 先打开一 ...

  2. MUI框架-09-MUI 与后台数据交互

    MUI框架-09-MUI 与后台数据交互 本篇介绍使用 art-template 和原生 MUI 的数据交互 mui.ajax 来实现 我们大家都知道,想要数据交互就要有数据,每次当我们发送请求,我们 ...

  3. .net core系列之《将.net core应用部署到Ubuntu》

    1.首先准备一个演示项目. 2.然后将这个项目用FileZilla工具上传到Ubuntu中. 3.进入目标文件,接下来有两种方法来部署项目 a.用dotnet run命令 root@hhz-virtu ...

  4. Sql Server关于日期查询时,如果表中日期到具体某个时间

    1.如果查询日期参数为'2017/02/21',而数据库表中的字段为'2017/02/21 12:34:16.963',则需要格式化一下日期才能查询出来,如下 select * from table ...

  5. CSS标准文档流 块级元素和行内元素

    标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 空白折叠现象 ...

  6. time random sys 模块

    time模块 顾名思义就是时间模块 我们在之前就用过一些时间模块 比如你想要让打印的时间延迟就time.sleep() 首先我们知道这是一个时间操作的模块 它可以分为三种模式:时间戳模式.格式化时间模 ...

  7. CAGradientLayer实现图片渐变透明效果

    CAGradientLayer实现图片渐变透明效果 要实现的效果如下: 源码: // // RootViewController.m // CAGradientLayer // // Copyrigh ...

  8. 安装SCOM Reporting Server

    在SQL群集计算机上可以安装SCOM Reporting Server. 1.运行SQL Server安装程序,选择 全新安装SQL Server,不能向已有的群集实例中添加Reporting Ser ...

  9. 毫秒级百万数据分页存储过程(mssql)

    /****** Object: StoredProcedure [dbo].[up_Page2005] Script Date: 11/28/2013 17:10:47 ******/ SET ANS ...

  10. SQL Server用户自定义函数(UDF)

    一.UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且可以作为一个单元来进行调用. UDF和存储过程的主要区别在于返回结果的方式: 使用UDF时可传 ...