当前位置: 首页 > news >正文

leetcode-链表篇3

leetcode-61

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 109

思路:看图片可以发现,这个题目本质上,是把链表分成两部分,交换前后两部分的顺序

所以重点在于找到分裂点,以及拼接

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* rotateRight(ListNode* head, int k) {if(!head || !head->next || k == 0) {return head;}auto tmp = head;int count = 0;auto tail = head;while(tmp) {tail = tmp;tmp = tmp->next;++count;}tmp = head;k %= count;if(k == 0) {return head;}k = count - k;while(--k && tmp) {tmp = tmp->next;}auto new_head = tmp->next;tmp->next = nullptr;tail->next = head;return new_head;}   
};

leetcode-206

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

思路:递归法比较简单,还是我们的老模板

void circle(ListNode *head) {if(...) {return }        //边界条件auto res = circle(head->next);//other code//return
}

迭代法也是一器破万法。

关于链表反转的题目,都分成两部分,pre和curr

pre就是已经处理好的部分的尾节点, curr就是你要处理的部分的头节点

所以伪代码如下

//关于翻转链表相关的题目
while(xxx) {process(curr);      //实现翻转的逻辑pre = curr;         //当前部分已经处过,所以pre变成currcurr = curr->next;  //curr->next还没处理过,所以curr指向自己的next继续处理
}
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {if(!head || !head->next) {return head;}// auto next = reverseList(head->next);// auto tmp = head->next;// head->next = nullptr;// tmp->next = head;// return next;auto pre = head;pre = nullptr;while(head) {auto next = head->next;head->next = nullptr;head->next = pre;pre = head;head = next;}return pre;}
};

leetcode-92

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

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

思路,和上题一样,不过是对翻转的区间有限制了。

加上前缀节点pre,找到要翻转的区间的头尾节点,将之翻转后。拼接回原来的链表

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {if(!head || !head->next) {return head;}auto tmp = new ListNode(-1);tmp->next = head;auto pre = tmp;int count = left;while(--count) {tmp = tmp->next;}auto curr = tmp->next;for(int i=0; i<right-left; i++) {auto tail = curr->next->next;auto next = curr->next;curr->next = tail;auto new_tail = tmp->next;tmp->next = next;next->next = new_tail;}return pre->next;}
};

leetcode-24

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

思路:还记得我们一器破万法的迭代法模板吗,直接套用就可以

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(!head || !head->next) {return head;}auto pre = new ListNode(-1);pre->next = head;auto curr = head;auto tmp = pre;while(curr && curr->next) {auto tail = curr->next->next;auto next = curr->next;curr->next = tail;auto new_tail = tmp->next;next->next = new_tail;tmp->next = next;tmp = curr;curr = curr->next;}return pre->next;}
};

leetcode-25

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

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

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

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

提示:
  • 链表中的节点数目为 n
  • 1 <= k <= n <= 5000
  • 0 <= Node.val <= 1000

进阶:你可以设计一个只用 O(1) 额外内存空间的算法解决此问题吗?

思路:做了以上几道题目,总结了自己的一器破万法模板之后,发现这个题竟然这么简单

以前被自己视为面试杀手的接雨水,k个一组翻转链表也变得简单起来

这题和上一题的唯一不同就在于,需要遍历一遍算出链表的长度,避免越界

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {auto tmp = head;int count=0;while(tmp) {++count;tmp = tmp->next;}if(!head || !head->next || k>count || k<=1) {return head;}auto pre = new ListNode(-1);pre->next = head;tmp = pre;auto curr = head;    for(int i=0; i<count/k; i++) {for(int j=1; j<k; j++) {auto tail = curr->next->next;auto next = curr->next;curr->next = tail;auto new_tail = tmp->next;next->next = new_tail;tmp->next = next;}tmp = curr;curr = curr->next;}return pre->next;}
};

相关文章:

leetcode-链表篇3

leetcode-61 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#x…...

RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨

近年来&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;的迅猛发展&#xff0c;我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;作为一种创新方法&#xff0c;极大地…...

C语言介绍

什么是C语言 C programing language 能干什么 Hello world&#xff1f; 如何学C语言 no reading no learning...

损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》

论文地址:https://arxiv.org/pdf/2307.07662v1.pdf 边界框回归(Bounding Box Regression,BBR)在目标检测和实例分割中得到了广泛应用,是目标定位的重要步骤。然而,对于边界框回归的大多数现有损失函数来说,当预测的边界框与真值边界框具有相同的长宽比,但宽度和高度的…...

WMware安装WMware Tools(Linux~Ubuntu)

1、这里终端里面输入sudo apt upgrade用于更新最新的包 sudo apt upgrade 2、安装 open-vm-tools-desktop 包&#xff0c; Ps&#xff1a;这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功&#xff1a…...

SLAM ORB-SLAM2(30)关键帧跟踪

SLAM ORB-SLAM2(30)关键帧跟踪 1. 关键帧跟踪2. TrackReferenceKeyFrame2.1. 将当前普通帧的描述子转化为BoW向量2.2. 通过词袋BoW加速当前帧与参考帧之间的特征点匹配2.3. 将上一帧的位姿态作为当前帧位姿的初始值2.4. 通过优化3D-2D的重投影误差来获得位姿2.5. 剔除优化后的…...

k8s 部署 prometheus

创建namespace prometheus-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: ns-prometheus拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/prometheus/prometheus:v2.54.0prometheus配置文件configmap prometheus-configmap.yaml …...

使用VBA快速生成Excel工作表非连续列图片快照

Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…...

解决GitHub下载速度慢

解决GitHub下载速度慢 方法一&#xff1a;使用git clone 地址 --depth 1来下载 depth 1 表示只科隆最新的一次提交&#xff0c;也就是默认主分支&#xff0c;而不是完整地克隆整个代码仓库&#xff0c;这样可以减少下载地数据&#xff0c;加快克隆操作 可以用git clone 地址 …...

【机器学习(五)】分类和回归任务-AdaBoost算法

文章目录 一、算法概念一、算法原理&#xff08;一&#xff09;分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 &#xff08;二&#xff09;回归算法基本思路1、最大误差的计算2…...

【设计模式-模板】

定义 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义了一个算法的骨架&#xff0c;并将一些步骤延迟到子类中实现。通过这种方式&#xff0c;模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…...

小程序原生-列表渲染

1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号&#xff1a;{{index}} - 元素&#xff1a;{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...

JAVA认识异常

目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的分类 1. 编译时异常 2. 运行时异常 2.1 异常的处理 防御式编程 2.2 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 总结 1. 异常…...

2024年10月计划(工作为主,Ue5独立游戏为辅,)

我发现一点&#xff0c;就是工作很忙&#xff0c;比如中秋也在远程加班&#xff0c;周末有时也远程加班&#xff0c;国庆节甚至也差点去甲方工作。甚至有可能驻场。可见&#xff0c;小公司确实不能去。 好在&#xff0c;9月份时&#xff0c;通过渲染 除了上班时间外&#xff0…...

并发、并行和异步设计

译者个人领悟,一家之言: 并发和并行确实可以明确区分出来,因为cpu的速度非常快,在执行一个任务时经常要等其他组件,比如网络,磁盘等,如果一直串行等待这样就会造成很大的浪费. (就类似于烧水的同时,可以切菜,不用等烧水完成了才去切菜,我可以烧一会水,火生起来了水壶放上了,随…...

求职Leetcode题目(12)

1.只出现一次的数字 异或运算满足交换律 a⊕bb⊕a &#xff0c;即以上运算结果与 nums 的元素顺序无关。代码如下&#xff1a; class Solution {public int singleNumber(int[] nums) {int ans 0;for(int num:nums){ans^num;}return ans;} } 2.只出现一次的数字II 这是今天滴…...

【YashanDB知识库】如何配置jdbc驱动使getDatabaseProductName()返回Oracle

本文转自YashanDB官网&#xff0c;具体内容请见https://www.yashandb.com/newsinfo/7352676.html?templateId1718516 问题现象 某些三方件&#xff0c;例如 工作流引擎activiti&#xff0c;暂未适配yashandb&#xff0c;使用中会出现如下异常&#xff1a; 问题的风险及影响 …...

Hadoop三大组件之MapReduce(一)

Hadoop之MapReduce 1. MapReduce是什么 MapReduce是一个分布式运算程序的编程框架&#xff0c;旨在帮助用户开发基于Hadoop的数据分析应用。它的核心功能是将用户编写的业务逻辑代码与自带的默认组件整合&#xff0c;形成一个完整的分布式运算程序&#xff0c;并并发运行在一…...

SQL Server 分页查询的学习文章

SQL Server 分页查询的学习文章 一、SQL Server 分页查询1. 什么是分页查询&#xff1f;2. SQL Server 的分页查询方法2.1 使用 OFFSET 和 FETCH NEXT语法&#xff1a;示例&#xff1a; 2.2 使用 ROW_NUMBER() 方法语法&#xff1a;示例&#xff1a; 2.3 性能考虑3. 总结 一、S…...

告别PDF大文件困扰!4款PDF在线压缩工具助你轻松优化!

嘿&#xff0c;档案员小伙伴们&#xff0c;今天咱们来聊聊那些让咱们在档案堆里游刃有余的神器。这些工具啊&#xff0c;简直就是咱们档案员的得力助手&#xff0c;特别是在PDF压缩这块儿&#xff0c;简直就是神器中的神器&#xff01; 1、福昕转换大师 网址&#xff1a;http…...

Simulink整车控制器vcu应用层模型,实车在用的,支持仿真和生成 文件分类明确

Simulink整车控制器vcu应用层模型&#xff0c;实车在用的&#xff0c;支持仿真和生成 文件分类明确&#xff0c;每个普通功能和核心功能建有单独的库&#xff0c;存放在文件夹里。 有相应的表格&#xff0c;描述了信号的意思。搞汽车电子的兄弟都知道&#xff0c;整车控制器&am…...

导师推荐!盘点2026年顶流之选的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年AI论文写作工具全面升级&#xff0c;实测提速超300%&#xff0c;覆盖选题构思、文献综述、数据整理、格式排版等核心场景&#xff0c;高效搞定论文不再是梦想。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一…...

如何在浏览器中零门槛查看3D模型?这款开源工具让你告别专业软件

如何在浏览器中零门槛查看3D模型&#xff1f;这款开源工具让你告别专业软件 【免费下载链接】Online3DViewer A solution to visualize and explore 3D models in your browser. 项目地址: https://gitcode.com/gh_mirrors/on/Online3DViewer 想不想在浏览器里直接打开3…...

从卡顿到实时:Shenyu网关WebSocket通知系统如何解决微服务配置同步难题

从卡顿到实时&#xff1a;Shenyu网关WebSocket通知系统如何解决微服务配置同步难题 你是否遇到过这样的困境&#xff1a;API网关配置更新后&#xff0c;客户端需要等待数分钟甚至更长时间才能生效&#xff1f;在秒杀活动等高并发场景下&#xff0c;这种延迟可能导致流量分配不…...

3D打印机步进电机参数计算全攻略:从同步带到丝杆的实战配置

3D打印机步进电机参数计算全攻略&#xff1a;从同步带到丝杆的实战配置 在DIY 3D打印机的过程中&#xff0c;步进电机的参数计算往往是让初学者最头疼的环节之一。无论是同步带驱动的XY轴&#xff0c;还是丝杆控制的Z轴&#xff0c;亦或是齿轮传动的挤出机构&#xff0c;都需要…...

别再为传感器数据缺失头疼了!用PyPOTS的SAITS模型,5分钟搞定时间序列插补(附完整代码)

工业传感器数据缺失的智能修复&#xff1a;PyPOTS与SAITS实战指南 在工业4.0时代&#xff0c;生产线上的温度、压力和振动传感器如同设备的"神经系统"&#xff0c;每秒产生海量时序数据。但当网络波动或设备故障导致数据缺失时&#xff0c;就像神经信号中断——设备状…...

高效USB设备管理工具:一键安全弹出的专业解决方案

高效USB设备管理工具&#xff1a;一键安全弹出的专业解决方案 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quick, flexible, portable alternative…...

Tracepoint性能优化揭秘:从DECLARE_EVENT_CLASS看Linux内核如何节省50%内存开销

Tracepoint性能优化揭秘&#xff1a;从DECLARE_EVENT_CLASS看Linux内核如何节省50%内存开销 在Linux内核的性能调优领域&#xff0c;Tracepoint机制作为静态跟踪的核心基础设施&#xff0c;其性能表现直接影响着系统监控和故障诊断的效率。本文将深入剖析DECLARE_EVENT_CLASS共…...

别再纠结了!Android音视频开发选软解(FFmpeg)还是硬解(MediaCodec)?一个实战Demo帮你做决定

Android音视频开发实战&#xff1a;软解与硬解的性能对决 在移动端音视频开发领域&#xff0c;选择软解还是硬解一直是个令人头疼的问题。每次技术选型会议上&#xff0c;总能看到两派开发者争得面红耳赤——软解支持者强调其灵活性和兼容性&#xff0c;硬解拥趸则推崇其性能和…...

哔哩哔哩第三方开放平台软件bilipai7.0.2

bilipai是一款面向B站内容爱好者的第三方安卓客户端&#xff0c;它有着清新灵动的界面风格和流畅自然的操作体验&#xff0c;能完整同步B站的各类视频资源&#xff0c;包括番剧、动画、知识科普、生活分享等内容类别&#xff0c;用户登录账号后&#xff0c;还可以实时同步自己的…...