【力扣二刷思路】DAY4

2024-03-19 23:28
文章标签 力扣 二刷 day4 思路

本文主要是介绍【力扣二刷思路】DAY4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

思路

  1. reverseKGroup函数

    • 该函数接收两个参数:一个指向链表头节点的指针head和一个整数k,表示每次需要反转的节点数。
    • 首先定义一个指针p指向头节点head,用于遍历链表。
    • 然后使用循环从头节点开始向后遍历k个节点,如果遍历到的节点为空(即链表长度不足k),则直接返回头节点head。
    • 否则,调用reverse函数对当前的k个节点进行反转,将得到的反转后的链表头节点指针存储在变量ans中。
    • 然后,将原来的头节点head的next指针指向递归调用reverseKGroup函数对剩余节点进行处理的结果,即p指针所指向的位置。这样就将原链表中的每k个节点反转后与剩余节点连接起来。
    • 最后,返回反转后的链表头节点指针ans。
  2. reverse函数

    • 该函数用于反转链表中指定区间的节点,接收两个参数:指向待反转链表段左端点的指针left和指向右端点的指针right。
    • 在函数内部定义了两个指针p和q,分别指向左右端点。
    • 使用双指针法,遍历并反转左右端点之间的节点:
      • 定义临时指针t保存p的下一个节点。
      • 将p指向q,完成节点的反转。
      • 移动q指针到p的位置。
      • 移动p指针到下一个节点。
    • 最后返回反转后链表段的头节点指针q。

通过递归和反转单个链表的方式实现了每k个节点进行反转的功能。

题解

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {} // 默认构造函数,初始化val为0,next为空指针*     ListNode(int x) : val(x), next(nullptr) {} // 接收一个整数参数的构造函数,初始化val为x,next为空指针*     ListNode(int x, ListNode *next) : val(x), next(next) {} // 接收一个整数参数和指向下一个节点的指针参数的构造函数,初始化val为x,next为next* };*/
class Solution {
public:// 反转链表中每k个节点的函数ListNode* reverseKGroup(ListNode* head, int k) {ListNode* p = head; // 定义指针p指向头节点// 遍历链表中的每k个节点for (int i = 1; i <= k; i++) {if (p == nullptr) // 如果p为空,说明剩余节点数量不足k个,直接返回头节点return head;p = p->next; // 否则指针p移动到下一个节点}// 反转当前k个节点,并返回反转后的链表头节点指针ListNode* ans = reverse(head, p);// 将原头节点指向反转后的剩余节点的结果head->next = reverseKGroup(p, k);return ans; // 返回反转后的链表头节点指针}private:// 反转链表中指定区间的节点ListNode* reverse(ListNode* left, ListNode* right) {ListNode *p = left, *q = right; // 定义双指针p和q,分别指向左端点和右端点// 遍历并反转左右端点之间的节点while (p != right) {ListNode* t = p->next; // 临时指针t保存p的下一个节点p->next = q; // 将p指向q,完成反转q = p; // 移动q指针到p的位置p = t; // 移动p指针到下一个节点}return q; // 返回反转后链表段的头节点指针}
};

【力扣刷题练习】25. K 个一组翻转链表

92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

思路

  1. 首先创建一个虚拟头节点 dummy,并初始化指针 p 指向虚拟头节点。虚拟头节点的作用是处理反转区间的起始位置可能为头节点的情况。

  2. 将虚拟头节点的下一个节点指向原链表的头节点 head,以方便统一处理链表操作。

  3. 使用循环将指针 p 移动到指定位置,即要反转区间的前一个节点。

  4. 定义指针 q 指向要开始反转的节点,即 p 的下一个节点。

  5. 进行循环反转指定区间内的节点:

    • 在每次循环中,将 q 的下一个节点保存在临时变量 t 中。
    • q 的下一个节点指向 t 的下一个节点,即删除 q->next
    • t 的下一个节点指向 p 的下一个节点,即将 t 插入到 p 之后。
    • p 的下一个节点指向 t,完成节点的插入。
  6. 循环结束后,返回虚拟头节点 dummy 的下一个节点,即反转后的链表头节点。

总体思路是通过创建一个虚拟头节点来处理反转区间的起始位置可能为头节点的情况,并使用指针操作来反转链表中的指定区间。这段代码在时间复杂度上是 O(n),其中 n 为要反转的节点个数。

题解

class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {// 创建虚拟头节点,并初始化指针 p 指向虚拟头节点ListNode *dummy = new ListNode(0), *p = dummy;// 将虚拟头节点的下一个节点指向原链表的头节点dummy->next = head;// 移动指针 p 到指定位置,使得 p 指向要反转区间的前一个节点for (int i = 1; i < left; i++)p = p->next;// 记录要反转区间的起始节点ListNode *q = p->next;// 循环反转指定区间内的节点for (int i = left; i < right; i++) {// 将 q 的下一个节点保存在临时变量 t 中ListNode *t = q->next;// 将 q 的下一个节点指向 t 的下一个节点,即删除 q->nextq->next = t->next;// 将 t 的下一个节点指向 p 的下一个节点,即将 t 插入到 p 之后t->next = p->next;// 将 p 的下一个节点指向 t,完成节点的插入p->next = t;}// 返回虚拟头节点的下一个节点,即反转后的链表头节点return dummy->next;}
};

【力扣刷题练习】92. 反转链表 II

这篇关于【力扣二刷思路】DAY4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827565

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,