#leetcode刷题之路25- k个一组翻转链表
给出一个链表,每 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个一组翻转链表的更多相关文章
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- leetcode 25. K 个一组翻转链表
# coding:utf-8 __author__ = "sn" """ 25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返 ...
- LeetCode 25. K 个一组翻转链表 | Python
25. K 个一组翻转链表 题目来源:https://leetcode-cn.com/problems/reverse-nodes-in-k-group 题目 给你一个链表,每 k 个节点一组进行翻转 ...
- Leetcode题库——25.k个一组翻转链表
@author: ZZQ @software: PyCharm @file: ReverseList.py @time: 2018/11/6 15:13 题目要求:给出一个链表,每 k 个节点一组进行 ...
- [LeetCode] 25. k个一组翻转链表
题目链接: https://leetcode-cn.com/problems/reverse-nodes-in-k-group/ 题目描述: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链 ...
- LeetCode 25 —— K 个一组翻转链表
1. 题目 2. 解答 首先,利用快慢指针确定链表的总结点数. 偶数个结点时,结点个数等于 i * 2. 奇数个结点时,结点个数等于 i * 2 + 1. 然后将链表的每 K 个结点划分为一组.循环对 ...
- [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...
- LeetCode 25. k个一组翻转链表(Reverse Nodes in k-Group)
题目描述 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定 ...
- [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 ...
随机推荐
- Latex表格太宽处理方法 (How to shorten Latex table length)
当表格太宽时, 为了能在页面中显示完整, 可以缩小表格, 或者横排.缩小表格的好处是, 不用倒转页面阅读, 坏处是原始宽度不同的表格, 被缩小后, 字体不一, 不美观. 虽然可以调整参数使得所有表格字 ...
- 关于serialVersionUID与序列化"
java序列化trick and trap 厂内经常出现序列化对象版本不匹配问题,于是发本文说明一些序列化的注意点 调用MQ.memcached.rpc等等涉及到远程通讯的都会经过序列化,虽然客户端透 ...
- 用FileZilla Server开FTP
FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...
- centos编译安装php7
环境说明 VMware 12 中搭建的CentOS 7 x64 4核 2G内存 环境中已经安装了http://blog.csdn.net/u014595668/article/details/5016 ...
- Excel英语成绩单 吴昊
- 关于Oracle伪列rownum
rownum列跟rowid列不一样,虽然同为表的伪列.但是rowid列是列的一个固定属性,而rownum列是结果集的一个排序.所以像如下查询是不会返回结果的:select rowid,rownum,e ...
- UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS
引用地址: http://www.cnblogs.com/silenkee/articles/1609831.html 页面中加入了UpdatePanel后,Response.Write(&quo ...
- 在android工程中添加图片资源(转加)
在Android工程中,每添加一个资源,就会在gen目录下的R.java中自动生成一个新的静态整型变量来指向这个资源.程序文件中调用资源的时候,先在R.java中找到变量名,然后根据变量值查找资源. ...
- 布隆过滤器(Bloom Filter)简要介绍
一种节省空间的概率数据结构 布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判.但是布隆过滤器也不是特别不精确,只要参数设置的 ...
- Programming Assignment 2: Seam Carving
编程作业二 作业链接:Seam Carving & Checklist 我的代码:SeamCarver.java 问题简介 接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩 ...