【链表】链表OJ-力扣2074. 反转偶数长度组的节点【超详细的算法解释】
说在前面
今天博主给大家带来的是力扣上的一道链表OJ,完成这道题后,博主感觉这题覆盖了很多链表的解题思想,另外,这道题对指针的控制也是比较高的。在这里博主将这道好题分享给大家!
另外,对于链表等数据结构还没有很熟悉的伙伴,可以通过传送门食用!
博主给大家的话

那么这里博主先安利一下一些干货满满的专栏啦!
数据结构专栏:手撕数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:跟着博主刷Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
题目描述

解题思路
思路:
首先我们想到的大致思路是,先定义两个指针fast和slow,fast往前走,走几步之后,我们反转fast和slow之间的链表,再拼接起来。又因为现在题目所给链表是不带头的,
slow指向的节点,是我们要反转的链表的头节点(如果需要要反转的话),而fast所指向的节点是要反转的链表的尾节点的后一个节点。
就拿例子1来举例子,我们的指针位置应该是这样的:
- 那我们该如何去找这个反转区间呢,这个很简单,第一次
fast走一步,第二次走两步,第三次走三步…,当fast走的步数是偶数次时,反转。如果要反转一个区间的链表,光有这两个指针是不够的。
假设我们刚才要反转[2,6]那个区间的链表,我们必须先让6的next置空,然后反转2开头的链表,再链接到5上,然后再把尾链接到3上,所以我们还需要两个指针,slow_prev和fast_prev,分别指向fast的前一个节点和slow的前一个节点。
完整的实现代码
// 2074. 反转偶数长度组的节点
class Solution {
private:
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* newhead = NULL;
if (head == NULL) {
return head;
}
struct ListNode* cur = head;
struct ListNode* next = head->next;
while (cur != NULL) {
cur->next = newhead;
newhead = cur;
cur = next;
if (cur != NULL) {
next = cur->next;
}
}
return newhead;
}
public:
ListNode* reverseEvenLengthGroups(ListNode* head) {
if (head == NULL || head->next == NULL)return head;
ListNode* slow_prev = head;
ListNode* fast_prev = head;
ListNode* fast = head;
ListNode* slow = head;
for (int i = 1;; i++) {
int i_tmp = i;
while (i_tmp && fast) {
fast_prev = fast;
fast = fast->next;
i_tmp--;//这个一定要放在里面,否则就减多一次了!
}
if ((i - i_tmp) % 2 == 0) {//有可能最后一个区间走不完,所以只需要看走了多少步
//反转链表
fast_prev->next = NULL;
slow_prev->next = reverseList(slow);
//找尾
while (slow_prev->next) {
slow_prev = slow_prev->next;
}
slow_prev->next = fast;
slow = fast;
fast_prev = slow_prev;
}
else {//不用反转
slow_prev = fast_prev;
slow = fast;
}
if (fast == NULL)break;
}
return head;
}
};
调试代码(编译器调试用)
如果我们在自己写这道题时遇到困难,需要复制到本地IDE上调试,博主把链表弄好了提供给大家,大家直接调试接口就好了!
ListNode* _CreatListNode(int x);
void ListPushBack(ListNode** pphead, int x);
int main() {
//[5,2,6,3,9,1,7,3,8,4]
Solution su;
ListNode* head = NULL;
ListPushBack(&head, 5);
ListPushBack(&head, 2);
ListPushBack(&head, 6);
ListPushBack(&head, 3);
ListPushBack(&head, 9);
ListPushBack(&head, 1);
ListPushBack(&head, 7);
ListPushBack(&head, 3);
ListPushBack(&head, 8);
ListPushBack(&head, 4);
//从这里开始调试
ListNode* ret = su.reverseEvenLengthGroups(head);
return 0;
}
ListNode* _CreatListNode(int x) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = x;
newNode->next = NULL;
return newNode;
}
void ListPushBack(ListNode** pphead, int x) {
ListNode* newNode = _CreatListNode(x);
//空链表的情况
if (*pphead == NULL) {
*pphead = newNode;
}
else {
//找尾
ListNode* tail = *pphead;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = newNode;
}
}
尾声
看到这里,相信你已经学会这道题了,如果你感觉这篇博客对你有帮助的话,不要忘了一键三连哦!
【链表】链表OJ-力扣2074. 反转偶数长度组的节点【超详细的算法解释】的更多相关文章
- 力扣 - 92. 反转链表II
目录 题目 思路1(迭代) 代码 复杂度分析 思路2(递归) 代码 复杂度分析 题目 92. 反转链表 II 思路1(迭代) 将反转链表分成3个部分:前一段未反转的部分.待反转链表部分.后一段未反转部 ...
- 【力扣】反转链表I和II(迭代和递归)
前言 有句话叫做:如果面试官跟你看顺眼的话,就给你出一道反转链表,否则就出一道 hard. 所以反转链表不能不会吧,要不面试官想要你都没有机会了. 206. 反转链表 class Solution { ...
- 刷题-力扣-541. 反转字符串 II
541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...
- Leetcode(力扣) 整数反转
Leetcode 7.整数反转 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: -123 输出: -321 注意: 假设我们的环境只能存储得下 32 位的有符 ...
- 力扣541. 反转字符串 II
原题 1 class Solution: 2 def reverseStr(self, s: str, k: int) -> str: 3 begin,lens,ans = 0,len(s),' ...
- 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释
题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 力扣—Reorder List(重排链表)python实现
题目描述: 中文: 给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点 ...
- 力扣 ——Linked List Cycle II(环形链表 II) python实现
题目描述: 中文: 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). ...
- 力扣——Linked List Cycle(环形链表) python实现
题目描述: 中文: 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...
随机推荐
- POJ - 1190 生日蛋糕(深搜+神奇的剪枝)
链接:https://ac.nowcoder.com/acm/contest/1015/B 题目描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱 ...
- 2014年第五届蓝桥杯【C++省赛B组】
第一题:啤酒和饮料 啤酒每罐2.3元,饮料每罐1.9元.小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒. 注意:答案是一个整数.请通过浏览器提 ...
- Serverless 时代开启,云计算进入业务创新主战场
作者 | 于洪涛 "我们希望让用户做得更少而收获更多,通过 Serverless 化,让企业使用云服务像用电一样简单." Serverless 化正在成为全新的软件研发范式,阿里云 ...
- 《3D编程模式》写书-第2次记录
大家好,目前我已经完成了"拼接模式"."撤销重做模式"."ECS模式"的初稿 下面会给出它们的使用场景,如果您正好能用到,请联系我提前阅读模 ...
- freeswitch APR库内存池
概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. apr库中的大部分API都需要依赖于内存池,使用内存池简化内存管理,提高内存分配效率,减少内存操作中出错的概 ...
- qq快速打开邮箱的设置
登陆qq想快速进入邮箱,发现没有入口
- mybatis plus 获取新增实体的主键
转载请注明出处: mybatis plus 新增实体对象调用的是 IService 接口中的 save 方法: default boolean save(T entity) { return SqlH ...
- 如何开发一套苹果cms前端模板
本文运用了苹果cms官网的模板开发教程,开发了一套苹果cms的前端模板,感兴趣的同学可以去github下载使用. 什么是模板 模板是网站的主题外观,也被称为主题或皮肤.通过使用不同的模板,网站的前台可 ...
- Laravel - 路由的多层嵌套
Route::group(['prefix'=>'admin'],function(){ Route::get('/',function(){ return view('admin.articl ...
- 【scikit-learn基础】--『回归模型评估』之偏差分析
模型评估在统计学和机器学习中具有至关重要,它帮助我们主要目标是量化模型预测新数据的能力. 本篇主要介绍模型评估时,如何利用scikit-learn帮助我们快速进行各种偏差的分析. 1. **R² ** ...
