leetcode25 K 个一组翻转链表

这道题关于链表的操作,中间指针操作略复杂。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* p=head;//用来遍历链表的指针
ListNode* headpre= new ListNode(-1);//翻转后的链表头部之前的指针,用来返回反转后的head;
headpre->next=head;//当链表长度不足k时,确保返回正确值;
ListNode* pre=headpre;//pre为翻转一小段长度为k的部分时,之前已经翻转好的链表的尾部节点的指针
//每次从p开始向后遍历k个节点,如果p之后节点不足k个,此时flag为1,则break;
//如果p之后节点足够,那么这段长为k的链表首尾分别为[curtail, curhead],对子段进行翻转即可;
while(p!=NULL){
//如果从p往后有k个节点则继续计算,否则return;
//寻找界定的指针[curtail, p2, p3, ... , curhead] p,即p为curhead的下一个节点;
//curtail和curhead分别为将要翻转部分的头和尾(此处curtail和curhead按反转之后的顺序标记头尾)
ListNode* curtail=p;
int flag=0;
for(int i=1;i<k;i++){
p=p->next;
if(p==NULL) {flag=1;break;}
}
if(flag) break;
ListNode* curhead=p;
p=p->next;
//然后翻转curt与curh之间的节点;
ListNode* pcur=curtail;
ListNode* pnext=curtail->next;
while(pcur!=curhead){
ListNode* tmp=pnext->next;
pnext->next=pcur;
pcur=pnext;
pnext=tmp;
}
//让已经翻转好的部分的尾部指针pre指向刚刚翻转好的这段的头部指针;
//让刚刚翻转好的这段的尾部指针指向后面未反转部分的第一个节点;
//更新pre为curtail;
pre->next=curhead;
curtail->next=p;
pre=curtail;
}
return headpre->next;
}
};
改进一下代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* headpre=new ListNode(-1);
headpre->next=head;
ListNode* p=head;
ListNode* pre=headpre;
while(p!=NULL){
//获取头尾
ListNode* left=p;
int flag=0;
for(int i=0;i<k-1;i++){
p=p->next;
if(p==NULL){ flag=1;break;}
}
if(flag) break;
ListNode* right=p;
p=p->next;
//进行翻转
ListNode* cur=left;
ListNode* next=left->next;
while(cur!=right){
ListNode* tmp=next->next;
next->next=cur;
cur=next;
next=tmp;
}
pre->next=right;
pre=left;
left->next=p;
}
return headpre->next;
}
};
leetcode25 K 个一组翻转链表的更多相关文章
- [Swift]LeetCode25. k个一组翻转链表 | Reverse Nodes in k-Group
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k ...
- [LintCode] 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 ...
- 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 个节点一组进行翻转 ...
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- LeetCoded第25题题解--K个一组翻转链表--java--链表
链表 单链表:链表中的每个元素实际上是一个单独的对象,而所有对象都通过每个元素的引用字段链接在一起. 双链表:与单链表不同的是,双链表的每个节点都含有两个引用字段. 链表优点 灵活分配内存空间 能在O ...
- leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表
24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...
- k个一组翻转链表(java实现)
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
- [LeetCode]25. 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. k ...
随机推荐
- android项目笔记整理(3)
61.AlphabetIndexer字母索引辅助类 实现对链表类型的数据进行快速索引. 应用于类似联系人列表右侧的导航栏 注意: 1.链表里的元素必须是Object类型,并实现 ...
- 如何远程调试部署在CloudFoundry平台上的nodejs应用
网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等. 在实际情况中,我们可能遇到本地运行良好 ...
- 5. First-Class Functions
Function in python are first-class objects (runtime / element / argument / return) 1. Treating a Fun ...
- Shell 语法报错记录
sh: missing ] if 条件语句 “或”多个条件并行时 执行then命令 变量a等于aa且变量b等于bb 或者 变量c等于cc且变量d等于dd 这样的条件成立的话,输出success if ...
- 拆机联想ideapad s500
这是我第一次拆机,中间也是经历了各种艰难险阻,最后还算是成功.首先,说一下拆机得目的:很简单,为了加一个内存条:下面具体说拆机得步骤: 第一步,在网上查攻略,刚开始的时候,并没有很详细的具体到机型,只 ...
- python批量下载邮件附件
背景 由于同学每周要通过邮箱收数学建模作业,100多人给她发附件,她要一个个地点着下载. 太麻烦了,所以想用程序实现下载附件的功能. 在网上查资料后,最终实现了稍为简单的下载附件功能,代码有些细节还不 ...
- c++中new的知识点
在练习内存池时,发现需要重载new,可是这个重载只是重载了operator new,那么还有哪几种new呢,下面来记录一下 首先记录一个点,在类中重载operator new,默认就是静态成员函数,所 ...
- BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]
方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...
- 阿里云ACP系列(复习笔记,题库,视频)
本人通过阿里云ACP认证总结的复习笔记,搜集的视频以及练习题库,助力大家顺利通过阿里云云计算工程师ACP,考试交流可加群:58284982 阿里云认证ACP-ECS (试题占比:31%) 阿里云认证A ...
- Qt中PushButton的pressed,released,clicked三种响应的区别
Qt的PushButton的常用的三种响应有pressed,released和clicked. 优先级:pressed>released>clicked 按下按钮pressed函数的内容, ...