由力扣K 个一组翻转链表到360原创题
前段时间帮对象做360笔试题时,遇到一个没怎么想明白的编程题,直到今天刷力扣遇到了相似的k个一组翻转链表后,想着在做一下那天的编程题,就想着记录一下遇到的难点。
力扣题如下图所示:
360原创题如下:
代码如下:
class Solution {
public:
pair<ListNode*,ListNode*> myReverse(ListNode* head,ListNode* pre1){
ListNode* prev = pre1->next;
ListNode* p = head;
while(pre1!=prev){
ListNode* temp = p->next;
p->next=prev;
prev = p;
p = temp;
}
return {pre1,head};
} //head,pre1是原链表的位置,注意注意!
ListNode* reverseKGroup(ListNode* head, int k) {
if(head->next->next==NULL) return head;
ListNode* hair = new ListNode(0);
hair->next = head; // //返回的头结点
ListNode* pre1 =head; //翻转的尾节点
ListNode* cur = head->next; //翻转尾节点的下一个节点
ListNode* pre2 = head; //固定每个头结点的上个节点
while(head->next){
while(cur->next!=NULL && (pre1->val==cur->val || cur->val==cur->next->val){
cur = cur->next;
pre1 = pre1->next;
}
head = cur;
pre2 = pre1;
while(cur->next!=NULL && pre1->val!=cur->val && cur->val!=cur->next->val){
pre1 = cur;
cur = cur->next;
}
if(cur->next ==NULL && pre2 != pre1){ //最后节点翻转的情况
pre1 = cur;
cur =NULL;
pair<ListNode*,ListNode*> result = myReverse(head,pre1);
head = result.first;
pre1 = result.second;
pre2->next = pre1;
head->next = cur;
}
else if(pre2 == pre1){ //最后节点不翻转的情况
return hair->next;
}
else if(cur->next!=NULL){ //中间节点翻转的情况
pair<ListNode*,ListNode*> result = myReverse(head,pre1);
head = result.first;
pre1 = result.second;
pre2->next = pre1;
head->next = cur;
pre1 = cur;
cur = cur->next;
} } }
return hair->next;
}
};
链表题虽然想法不难实现,但一些细节、边界问题还是很容易出现错误,这里特别是处理右边界的时候,弄的我很迷糊,一开始代码还是比较简洁的,加了很多测试案例后发现原代码行不通,再次基础上又添添补补,导致代码比较冗长,也算是一次心酸的添补史吧!剪枝的操作日后在想吧,哪位大佬有更简洁直观的代码可以分享我一下,感激不尽~
由力扣K 个一组翻转链表到360原创题相关推荐
- 力扣——k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...
- 链表经典题:K个一组翻转链表
题目: 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这 ...
- 25. K 个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- 20200329:K 个一组翻转链表(leetcode25)
K 个一组翻转链表 题目 思路与算法 代码实现 复杂度分析 题目 思路与算法 注意题目里的常数的额外空间的要求,意味着不可以使用栈之类的数据结构. 这道链表题实际就是上一道的进阶版,指定每k个进行翻转 ...
- LeetCode--第25题K个一组翻转链表
LeetCode–第25题K个一组翻转链表 题目描述 解决方案–C语言 主体是用递归的办法.递归三要素: 1.向上返回什么:一个处理好的子链表 2.返回条件是什么:要么是处于好了子链表,要么是因长度小 ...
- 哔哩哔哩2020校园招聘 - K个一组翻转链表 一年中的第几天
1.K个一组翻转链表 题目描述: 给你一个链表,每 k 个节点一组进行翻转,请返回翻转后的链表. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序. 示例 : 给定这个链表:1-&g ...
- 清晰易懂的“K个一组翻转链表”解法
题目来源:Leetcode K个一组翻转链表 一.题目 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍 ...
- K 个一组翻转链表(递归,Kotlin)
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- Leetcode-递归/反转链表模板-25. K 个一组翻转链表
题目25. K 个一组翻转链表: 题解: 模拟 以K个为一组,进行常规反转,重点是要保留反转前的头节点,以及第K+1个节点,将其反转之后连接起来 代码: /*** Definition for sin ...
最新文章
- 能和LoadRunner匹敌的VS2010/2012Web负载测试
- 初识 ElasticSearch,一个上天下地的搜索引擎 No.158
- 计算机ip地址删除,Windows 8 或 Windows Server 2012 中删除一个 IP 地址时,不正确地删除活动路由表项...
- {在头值中找到无效的字符。} 发email的时候 遇到这个问题 老师解决
- SpringBoot热加载实现与类加载浅谈
- mysql 的client_mysql(一)-客户端Client相关
- 23 岁创业,28 岁成为福布斯亚洲青年领袖,这个“刷脸的男人”有点牛
- python super详解_python中super()详解
- 030_磁盘调度策略比较
- Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
- [转]AndroidManifest.xml文件详解
- Flutter 常用的按钮组件
- 网易云课堂Python Flask框架全栈开发
- 向量空间 内积空间 欧氏空间 希尔伯特空间
- 血液透析机最全学习手册
- 用word模板制作幻灯片
- Expected binary or unicode string, got 3
- pb 如何导出csv_用问卷网做问卷调查 如何导出数据报表?
- 手写多位数字识别器实现 (转载请注明出处!)
- Cat Party (Easy Edition)