给出一个链表,每 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. JS判断客户端是手机还是PC的2个代码

    搬了下砖 function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", & ...

  2. CentOS6.5(3)----设置自己安装的程序开机自动启动

    CentOS6.5系统下设置自己安装的程序开机自动启动 方法1. 把启动程序的命令添加到 /etc/rc.d/rc.local 文件中,比如设置开机启动 mysqld: #!/bin/sh # # T ...

  3. jquery-animate()动画

    一.animate()语法 $(“选择器”).animate({CSS样式},时间,运动方式,回调函数); 参数说明: 参数1:CSS属性名,属性值,JSON格式{"属性名":&q ...

  4. Java基础之JSONObject的使用

    private static JSONObject createJSONObject() { JSONObject jsonObject = new JSONObject(); jsonObject. ...

  5. Frequently Used Algo

    1. 链表 链表逆转 class Solution { public: ListNode* reverseList(ListNode* head) { ListNode* prev = NULL; w ...

  6. 转载:什么才是真正的 RESTful 架构

    What? Wikipedia: 表征性状态传输(英文:Representational State Transfer,简称REST)是Roy Fielding博士于2000年在他的博士论文中提出来的 ...

  7. Java学习---XML的读写操作

    DOM4_Jwriter.java package com.ftl.xmlparse; import java.io.File; import java.io.FileNotFoundExceptio ...

  8. linux 三大利器 grep sed awk 正则表达式

    正则表达式目标 正则表达式单字符: 特定字符 范围字符:单个字符[ ] :代表查找单个字符,括号内为字符范围 数字字符:[0-9],[259] 查找 0~9 和 2.5 .9 中的任意一个字符 小写字 ...

  9. 使用 Nginx 对 ASP.NETCore网站 或 Docker 等进行反向代理,宝塔面板对 ASP.NET Core 反向代理

    1,Nginx 的 配置文件 Nginx 可以配置反向代理.负载均匀等, 其默认配置文件名为 nginx.conf . 一般存放于 /你的安装目录/nginx/conf  下 Nginx 加载配置信息 ...

  10. HTTP协议图--HTTP 响应状态码(重点分析)

    1. 状态码概述 HTTP 状态码负责表示客户端 HTTP 请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作. HTTP 状态码如 200 OK ,以 3 位数字和原因短语组成.数字中 ...