给出一个链表,每 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. Latex表格太宽处理方法 (How to shorten Latex table length)

    当表格太宽时, 为了能在页面中显示完整, 可以缩小表格, 或者横排.缩小表格的好处是, 不用倒转页面阅读, 坏处是原始宽度不同的表格, 被缩小后, 字体不一, 不美观. 虽然可以调整参数使得所有表格字 ...

  2. 关于serialVersionUID与序列化"

    java序列化trick and trap 厂内经常出现序列化对象版本不匹配问题,于是发本文说明一些序列化的注意点 调用MQ.memcached.rpc等等涉及到远程通讯的都会经过序列化,虽然客户端透 ...

  3. 用FileZilla Server开FTP

    FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...

  4. centos编译安装php7

    环境说明 VMware 12 中搭建的CentOS 7 x64 4核 2G内存 环境中已经安装了http://blog.csdn.net/u014595668/article/details/5016 ...

  5. Excel英语成绩单 吴昊

  6. 关于Oracle伪列rownum

    rownum列跟rowid列不一样,虽然同为表的伪列.但是rowid列是列的一个固定属性,而rownum列是结果集的一个排序.所以像如下查询是不会返回结果的:select rowid,rownum,e ...

  7. UpdatePanel中用后台CS代码调用JS代码,先执行控件事件,后触发JS

    引用地址: http://www.cnblogs.com/silenkee/articles/1609831.html   页面中加入了UpdatePanel后,Response.Write(&quo ...

  8. 在android工程中添加图片资源(转加)

    在Android工程中,每添加一个资源,就会在gen目录下的R.java中自动生成一个新的静态整型变量来指向这个资源.程序文件中调用资源的时候,先在R.java中找到变量名,然后根据变量值查找资源. ...

  9. 布隆过滤器(Bloom Filter)简要介绍

    一种节省空间的概率数据结构 布隆过滤器可以理解为一个不怎么精确的 set 结构,当你使用它的 contains 方法判断某个对象是否存在时,它可能会误判.但是布隆过滤器也不是特别不精确,只要参数设置的 ...

  10. Programming Assignment 2: Seam Carving

    编程作业二 作业链接:Seam Carving & Checklist 我的代码:SeamCarver.java 问题简介 接缝裁剪(Seam carving),是一个可以针对照片内容做正确缩 ...