LeetCode链表hard 有思路?但写不出来?

给你链表的头节点 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]

        刷过leetcode的hot100,应该对这个题都有思路,但是链表的这个题它为什么能算hard,还是因为大家写的通过率不高,思路看着不难,但其实里面很多细节,自己手写起来会有很多问题,那我们来捋清一下思路。

        首先,链表翻转在看完前面的分享,三指针应该很快可以写出来,那么现在让我们实现k个一组的链表翻转,最简单的思路:

  1. 判断后面还有没有k个node
  2. 如果有,翻转
  3. 如果没有,返回那个地方的头节点

        做链表的题目,首先别怕多创建指针,用就完事了,实现翻转,tail尾部用一个指针存放他的下一个next,head头节点也用一个指针指向,然后在翻转过程中需要一个指针用于迭代。剩下的就是画个图模拟局部的情况,迭代,考虑边界问题,后面代码会有详细注释。

        在到后面就是判段一下后面是否还有k个节点,然后把翻转后的链表拼接起来。(另外如果能够完整无误的写出这样的代码,那证明基本功已经很好了,加油)

class Solution {
public:// 定义一个函数用于翻转链表中指定区间的节点pair<ListNode*, ListNode*> myreverse(ListNode* head, ListNode* tail) {ListNode* pre = tail->next;  // 保存区间翻转前的前驱节点ListNode* p = head;  // 当前节点从头部开始// 进行区间翻转while (pre != tail) {ListNode* nex = p->next;  // 保存下一个节点p->next = pre;  // 当前节点指向前驱节点,实现翻转pre = p;  // 更新前驱节点为当前节点p = nex;  // 当前节点移向下一个节点}return { tail, head };  // 返回翻转后的头节点和尾节点}ListNode* reverseKGroup(ListNode* head, int k) {ListNode* hair = new ListNode(0);  // 创建一个虚拟头节点,指向链表头部hair->next = head;  // 虚拟头节点的下一个节点为链表头部ListNode* pre = hair;  // pre指针指向当前处理的区间的前驱节点while (head) {ListNode* tail = pre;  // tail指针指向当前处理的区间的尾节点// 找到当前区间的尾节点for (int i = 0; i < k; i++) {tail = tail->next;if (!tail)  // 如果区间长度不足k,直接返回虚拟头节点的下一个节点return hair->next;}ListNode* nex = tail->next;  // 保存当前区间的下一个节点tie(head, tail) = myreverse(head, tail);  // 调用翻转函数,返回翻转后的头节点和尾节点pre->next = head;  // 前驱节点指向翻转后的头节点tail->next = nex;  // 翻转后的尾节点指向下一个节点pre = tail;  // 更新前驱节点为翻转后的尾节点head = tail->next;  // 当前处理的头节点更新为翻转后的尾节点的下一个节点}return hair->next;  // 返回虚拟头节点的下一个节点作为翻转后的链表头部}
};

        另外有一种递归的写法,代码会更加简介,且空间复杂度为O(1);
        具体思路:思路和模拟方法相同,首先判断链表是否有K个数,不足则直接返回head。否则对前K个数进行反转,然后进行递归处理。

class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {ListNode *p = head;for(int i = 0; i < k; i++) {if(!p) return head;  // 如果剩余节点数量不足k个,则不进行翻转,直接返回头节点p = p->next;  // 指针p向后移动k个位置}ListNode *q = head;  // 指针q指向当前待翻转的区间的头节点ListNode *pre = nullptr;  // pre指向翻转后的区间的尾节点while(q != p) {  // 循环翻转整个区间内的节点ListNode *tmp = q->next;  // 保存q的下一个节点q->next = pre;  // 将q的next指针指向其前驱节点pre,实现翻转pre = q;  // 更新pre为当前翻转后的节点q = tmp;  // 更新q为下一个待翻转的节点}head->next = reverseKGroup(p, k);  // 将翻转后的区间与后面的链表连接起来return pre;  // 返回翻转后的区间的头节点作为新的头部}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/754353.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用docker启动centos的桌面环境

最近在dockerhub看见centos的桌面镜像 拉取镜像&#xff1a;docker pull kasmweb/centos-7-desktop:1.14.0 VNC_PWpassword输入你自己的密码 运行容器&#xff1a;docker run --rm -it --shm-size512m -p 6901:6901 -e VNC_PWpassword kasmweb/centos-7-desktop:1.14.0 该镜…

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)

【附下载】3Ds Max从安装、配置到入门提高和高级用法

#3Ds Max 一、安装 1.1 安装说明 地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1lwKMbgbE32wCL6PpMv706A?pwddll8 提取码&#xff1a;dll8 –来自百度网盘超级会员V2的分享 安装说明&#xff1a;文件夹里有安装说明 安装解压即可 关键就是将crack文件放到自己…

LVS+Keepalived 高可用群集--部署

实际操作 LVS Keepalived 高可用群集 环境设备 LVS1192.168.6.88 &#xff08;MASTER&#xff09;LVS2192.168.6.87 &#xff08;BACKUP&#xff09;web1192.168.6.188web2192.168.6.189客户端192.168.6.86VIP192.168.6.180 &#xff08;一&#xff09;web服务器 首先配置…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Polygon)

多边形绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Polygon(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0…

软件杯 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

注册-前端部分

前提&#xff1a;后端jar环境、Vue3环境、Redis环境 搭建页面&#xff08;html标签、css样式&#xff09; → 绑定数据与事件&#xff08;表单校验&#xff09; → 调用后台接口&#xff08;接口文档、src/api/xx.js封装、页面函数中调用&#xff09; Login.vue文件&#xff…

CentOS的安装

一、打开VMware的WorkStation的软件界面。点击创建新的虚拟机。 二、我们选择自定义&#xff0c;下一步。 三、这个界面不用动&#xff0c;直接进入下一步。 四、点击稍后安装操作系统&#xff0c;下一步。 五、选择Linux操作系统&#xff0c;版本为CentOS 7 64位。 六、虚拟机…

Day69:WEB攻防-Java安全JWT攻防Swagger自动化算法签名密匙Druid泄漏

目录 Java安全-Druid监控-未授权访问&信息泄漏 黑盒发现 白盒发现 攻击点 Java安全-Swagger接口-导入&联动批量测试 黑盒发现 白盒发现 自动化发包测试 自动化漏洞测试 Java安全-JWT令牌-空算法&未签名&密匙提取 识别 JWT 方式一&#xff1a;人工识…

前端 -- 基础 表单标签 -- 表单域

表单域 # 表单域是一个包含 表单元素 的区域 在 HTML 标签中&#xff0c; <form> 标签 用于定义表单域&#xff0c; 以实现用户信息的收集和传递 简单通俗讲&#xff0c; 就是 <form> 会把它范围内的表单元素信息提交给后台&#xff08;服务器) 对于上面讲…

24计算机考研调剂 | 【官方】桂林理工大学(11自命题、22自命题)

桂林理工大学信息工程与科学学院招收调剂 考研调剂补充信息 一、招收专业 计算机科学与技术&#xff08;学硕&#xff09;、软件工程&#xff08;学硕&#xff09;、计算机技术&#xff08;专硕&#xff09;、人工智能&#xff08;专硕&#xff09;、软件工程&#xff08;专…

php版本的AI电话机器人系统有哪些优势

PHP版本的AI电话机器人系统具有以下优势&#xff1a; 提升客户体验&#xff1a;AI电话机器人能够为客户提供724小时的服务&#xff0c;无论何时客户有疑问或需要帮助&#xff0c;都可以得到及时响应1。 提高工作效率和客户满意度&#xff1a;AI电话机器人系统具有智能回答问题…

【Sass】1px分割线 + 缩进分割线

效果图 1. 亮色模式效果 2. 暗色模式效果 设计思路 配色使用grey色 优点&#xff1a;无论在暗色模式还是亮色模式都可以看清楚分割线 使用after,before 伪元素绘制线条&#xff0c;并压缩线条transform: scaleY(.25) 注意事项 必须确保父级有宽高父级定位必须为position: r…

2、RabbitMQ_安装

RabbitMQ安装文档 RabbitMQ官网下载地址&#xff1a;https://www.rabbitmq.com/download.html 1.安装依赖 在线安装依赖环境&#xff1a; yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel m4 ncurses-devel tk tc x…

2025张宇考研数学基础36讲,视频百度网盘+PDF

一、张宇老师全年高数体系&#xff08;听课用书指南&#xff09; 25张宇全程&#xff1a; docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴在浏览器上打开&#xff0c;就可以看到2025张宇的全部的啦&#xff01; 一般来说我们把考研数学划分为3-4个阶段&#xff0c;分别是基础阶…

CSS详细教程

文章目录 前言一、CSS应用方式1.在标签上2.在head标签的style上3.写在文件中 二、选择器1.ID选择器2.类选择器3.标签选择器4.属性选择器5.后代选择器6.样式覆盖 三、CSS样式1.高度和宽度2.块级标签和行内标签转换3.字体颜色/大小/粗细/样式/对齐/边框4.浮动5.背景色6.内边距7.边…

IDEA上的Scala环境搭建

Scala环境搭建 一、搭建Scala开发环境 安装Scala编译器 安装scala-2.12.10.msi 检查scala安装情况 在dos窗口输入scala&#xff0c;检查是否能够进入编译器。进行简单的scala命令计算 在IDEA中进行scala编码 File - Settings - Plugins - MarketPlace中搜索scala插件 安…

总结mac下解决matplotlib中文显示问题的几种方法

一、前言&#xff1a; 使⽤matplotlib画图时&#xff0c;由于matplotlib默认没有中⽂&#xff0c;显⽰中文时会出现空⽩⼩⽅块。 二、方法&#xff1a; 2.1 matplotlib中使用SimHei字体 1&#xff09;进入终端后查看matplotlib的字体路径&#xff1a; $ python >>&g…

Mac玩《幻兽帕鲁》为什么打不开D3DMetal?d3d错误怎么办 d3dxl error

我之前发了一篇讲Mac电脑玩Steam热门新游《幻兽帕鲁》的文章&#xff08;没看过的点这里&#xff09;&#xff0c;后来也看到很多朋友去尝试了&#xff0c;遇到了一些问题&#xff0c;无法进入《幻兽帕鲁》游戏&#xff0c;或者是玩的时候卡顿以及出现黑屏&#xff0c;通过我的…

jQuery+CSS3自动轮播焦点图特效源码

jQueryCSS3自动轮播焦点图特效源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 下载地址 jQueryCSS3自动轮播焦点图特效源码