给出一个链表,每 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. 自定义Windows Form无法拖动,简单解决方案。

    我也不知道为什么要自定义一个没差的WinForm,反正就是遇到了MyForm无法用鼠标拖着走的问题,百度到的解决方案,记录一下:再把 [DllImport("user32.dll" ...

  2. js 捕捉回车键触发登录,并验证输入内容

    js 捕捉回车键触发登录,并验证输入内容 有时候我们会遇到 web 页面中捕捉按键,触发一些效果, 比如常见的回车键触发登录,并验证输入内容,下面会介绍,截图: 一.最简单的捕捉回车键:判断按下的是不 ...

  3. [翻译] MSAlertController

    MSAlertController You can use AlertController in iOS7!! 你可以在iOS中使用AlertController了 MSAlertController ...

  4. SCOM发送邮件通知

    运行方式配置:1. 新建账户--Windows域账户,安全级别较高,将其分发到SCOM管理服务器2. 配置文件--通知账户--将上一步新建的账户添加到该配置文件中的 运行方式账户,管理 所有目标对象 ...

  5. Hive开窗函数的理解

    1.从一个sql语句开始 select id,sum(price) over(partition by id order by price desc) from books; sum作为聚合函数的时候 ...

  6. except but

    He didn't speak anything but Greek... 他只会说希腊语.The crew of the ship gave them nothing but bread to ea ...

  7. Java 集合框架(常用数据结构)

    早在Java 2中之前,Java就提供了特设类.比如:向量(Vector).栈(Stack).字典(Dictionary).哈希表(Hashtable)这些类(数据结构)用来存储和操作对象组.虽然这些 ...

  8. 虚拟机下的CentOS无法上网的解决办法

    1.首先保证虚拟机的网络适配器为NAT模式 2.设置虚拟机的“编辑”-->“虚拟网络编辑器”中的VMnet8的DHCP的设置两个选项都勾选上. 3.设置物理主机,保证虚拟网关的IP地址为自动获取 ...

  9. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  10. JavaScript的事件对象_滚轮事件

    用户在使用键盘时会触发键盘事件.“DOM2 级事件”最初规定了键盘事件,结果又删除了相应的内容.最终还是使用最初的键盘事件,不过 IE9 已经率先支持“DOM3”级键盘事件. 一.键码 在发生 key ...