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

leetcode:反转链表II 和k个一组反转链表的C++实现

反转链表II

问题描述

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

ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *newhead = new ListNode(0);newhead->next = head;int i = 1;ListNode* pre = newhead;while(i < left){pre = pre->next;i++;}ListNode* cur = pre->next;ListNode* pnext;while(i < right and cur){pnext = cur->next;cur->next = pnext->next;pnext->next = pre->next;pre->next = pnext;i++;}return newhead->next;
}

 

这段代码定义了一个函数 reverseBetween,该函数的目的是反转一个单链表中从位置 left 到位置 right 的部分链表。链表的节点定义采用 ListNode 结构。

函数参数和返回值
  • 参数 ListNode* head 是指向链表第一个节点的指针。
  • 参数 int left 是需要开始反转的起始位置。
  • 参数 int right 是需要结束反转的终止位置。
  • 返回值 ListNode* 是指向经过部分反转后的链表的头节点的指针。
函数内部逻辑
  1. 创建一个新的头节点 newhead,其值为0,并将其 next 指针指向原链表的头节点 head。这是为了方便处理边界情况,特别是当 left 为1时。
  2. 初始化一个计数器 i 为1,用于记录当前的位置。
  3. 初始化一个指针 pre,它将用于跟踪第 left-1 个节点,即反转部分的前一个节点。
  4. 使用 while 循环将 pre 指针移动到第 left-1 个节点的位置。
  5. 初始化另一个指针 cur,它将用于跟踪当前要进行反转操作的节点,初始时指向第 left 个节点。
  6. 使用另一个 while 循环,在 i 小于 right 时进行反转操作,并确保 cur 不为空:
    • 将 pnext 指向 cur 的下一个节点。
    • 将 cur 的 next 指针指向 pnext 的下一个节点,这样就从链表中断开了 pnext
    • 将 pnext 的 next 指针指向 pre 的下一个节点,这样 pnext 就移动到了反转部分的开始位置。
    • 将 pre 的 next 指向 pnext,这样就将 pnext 插入到了反转部分的开始位置。
    • 增加计数器 i
  7. 循环结束后,从位置 left 到位置 right 的链表部分已经被反转。
  8. 返回 newhead->next,即新链表的头节点,因为 newhead 是一个哑节点。
总结

此代码通过迭代的方式,反转了单链表的一部分。它首先使用一个哑节点简化操作,然后通过两个循环移动节点,逐步实现链表的局部反转。最终返回新链表的头节点。

k个一组反转链表

问题描述

以 k 个节点为一组进行链表翻转,即每 k 个节点之内进行翻转,如果最后一组不足 k 个节点,则不进行翻转。

解决方案

以下是 C++ 代码实现:

ListNode* reverseKGroup(ListNode* head, int k) {if (head == nullptr || k == 1) {return head;}ListNode* dummy = new ListNode(0);dummy->next = head;ListNode *pre = dummy, *cur = dummy, *nex = dummy;int count = 0;// 计算链表长度while (cur->next != nullptr) {cur = cur->next;count++;}// 根据链表长度计算需要翻转的次数while (count >= k) {cur = pre->next; // 重置当前节点为组的第一个节点nex = cur->next; // 重置下一个节点// 进行 k-1 次翻转for (int i = 1; i < k; i++) {cur->next = nex->next;nex->next = pre->next;pre->next = nex;nex = cur->next;}pre = cur; // 将 pre 移动到下一组的开始位置count -= k; // 减少 k 个计数}return dummy->next;
}

这段代码定义了一个函数 reverseKGroup,用于按照给定的大小 k 反转一个单链表中的节点组。反转是以每 k 个节点为一组进行的,最后不足 k 个节点的组不会被反转。

函数参数和返回值
  • 参数 ListNode* head 是指向链表第一个节点的指针。
  • 参数 int k 是每组中的节点数量。
  • 返回值 ListNode* 是指向经过分组反转后的链表的头节点的指针。
函数内部逻辑
  1. 首先检查是否需要进行操作,如果链表为空 (nullptr) 或 k 等于1(即不需要分组反转),则直接返回原链表的头节点 head
  2. 创建一个哑节点 dummy,其值为0,并将其 next 指针指向原链表的头节点 head。这是为了方便操作,特别是当链表的头部需要被反转时。
  3. 初始化三个指针 precur 和 nex,它们都指向哑节点 dummypre 将用于跟踪每组反转前的第一个节点的前一个节点,cur 将用于遍历链表,而 nex 将用于反转操作中的节点交换。
  4. 初始化计数器 count 为0,用于记录链表的长度。
  5. 使用 while 循环计算链表的长度,并将长度存储在 count 中。
  6. 使用另一个 while 循环,只要 count 大于或等于 k,就执行以下操作:
    • 重置 cur 为当前组的第一个节点,即 pre 的下一个节点。
    • 重置 nex 为 cur 的下一个节点。
    • 进行 k-1 次反转操作,因为每组的第一个节点不需要移动,只需移动剩余的 k-1 个节点:
      • 将 cur 的 next 指向 nex 的下一个节点,这样就从链表中断开了 nex
      • 将 nex 的 next 指向 pre 的下一个节点,这样 nex 就移动到了当前组的开始位置。
      • 将 pre 的 next 指向 nex,这样就将 nex 插入到了当前组的开始位置。
      • 更新 nex 为 cur 的下一个节点,为下一次迭代做准备。
    • 在完成一组节点的反转后,将 pre 移动到这组的最后一个节点,即当前的 cur,准备进行下一组的反转。
    • 从 count 中减去 k,表示已经完成了一组节点的反转。
  7. 循环结束后,所有的 k 个节点的组都已经被反转,不足 k 个节点的组保持原样。
  8. 返回 dummy->next,即新链表的头节点,因为 dummy 是一个哑节点。
总结

此代码通过迭代的方式,每次反转链表中的 k 个节点。它首先使用一个哑节点简化操作,然后通过两个循环,一是计算链表长度,二是进行分组反转。最终返回新链表的头节点。

 

相关文章:

leetcode:反转链表II 和k个一组反转链表的C++实现

反转链表II 问题描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode *…...

ERD Online 快速启动指南:代码下载到首次运行的全流程攻略 ️

&#x1f680; 一、代码下载 ERD online前端代码正常拉取即可&#x1f44c; 后端代码含有子模块&#xff0c;拉取命令如下&#xff1a; git clone --recurse-submodules https://github.com/www-zerocode-net-cn/martin-framework.git &#x1f6e0;️ 二、代码构建 &#x1f3…...

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符&#xff0c;用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性&#xff0c;它是唯一具有此能力的C风格的转型操作符。在C11中&#xff0c;const_cast可以完成…...

C++从零开始的打怪升级之路(day45)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于二叉树的题目 1.根据二叉树创建字符串 606. 根…...

小鹅通前端实习一面

总时长35分钟&#xff0c;自我介绍开始 1.js和c特点上的差异&#xff1b; 2.js数组去重 3.js的数据类型 4.js的引用类型和值类型的差别 5.讲一下js的网络请求 6.对前端三件套和框架的理解 7.一个html文档的结构是怎样的 8.head和body的区别 9.一个页面的加载顺序&#xff08;ht…...

ArrayList常用API

常见方法 add 增remove 删set 改get 查clear 清空元素size 长度isEmpty 为空判断 用法 // String就是泛型 这种使用方法对于限制类型很有用 ArrayList<String> arrayList new ArrayList<>();// add 添加元素 返回的是boolean 代表是否添加成功 arrayList.add(&qu…...

Chrome安装Axure插件

打开原型目录/resources/chrome&#xff0c;重命名axure-chrome-extension.crx&#xff0c;修改后缀为rar&#xff0c;axure-chrome-extension.rar 解压到axure-chrome-extension目录打开Chrome&#xff0c;更多工具->扩展程序&#xff0c;打开开发者模式&#xff0c;选择加…...

【AI+应用】模仿爆款视频二次创作短视频操作步骤

本来不想水这篇的&#xff0c; 剪辑软件估计很多人用的比我还6。 今天自己遇到1个需求&#xff0c;我看到一篇公众号文章的视频觉得有意思&#xff0c;但视频有点长&#xff0c;我没带耳机看视频的习惯&#xff0c;就想着能不能下载下来&#xff0c; 提取视频的音频转为文字&am…...

HTML使用

文章目录 一、简介二、HTML快速入门三、基础标签四、图片、音频、视频标签五、超链接标签六、列表标签七、表格标签八、布局标签九、表单标签十、表单向标签 一、简介 二、HTML快速入门 ​ <html><head><title>你好</title></head><body>再…...

通过联合部署DDoS高防和WAF提升网站防护能力

如果您的网站遭受的攻击既有流量型攻击&#xff0c;又混杂精巧的Web应用层攻击时&#xff08;例如SQL注入、跨站脚本攻击、命令注入等&#xff09;时&#xff0c;推荐您组合使用阿里云DDoS高防和Web 应用防火墙 WAF&#xff08;Web Application Firewall&#xff09;&#xff0…...

具体挫折现象的发生以及解法思考:您如果继续不问的话,严重重责就容易来

一 积极想方设法的寻找扭转劣势的方式方法&#xff1b;  目前对于第一条的践行&#xff0c;主要还是依靠打工做事赚取收入。至于个人业务&#xff0c;只能往后推&#xff0c;往后延迟。因为不管您目前居住的环境&#xff0c;还是个人条件都不行&#xff0c;所以无法实行个人业…...

Type-C接口PD协议统一:引领电子科技新纪元的优势解析

在电子科技日新月异的今天&#xff0c;充电接口的统一化已经成为了业界的一大趋势。其中&#xff0c;Type-C接口凭借其传输速度快、使用便捷等优点&#xff0c;迅速成为了市场上的主流选择。而PD&#xff08;Power Delivery&#xff09;协议的统一&#xff0c;更是为Type-C接口…...

探讨2024年AI辅助研发的趋势

一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为当今时代最具变革性的技术之一。AI的广泛应用正在重塑各行各业&#xff0c;其中&#xff0c;AI辅助研发作为科技和工业领域的一大创新热点&#xff0c;正引领着研发模式的深刻变革。从医药…...

Java对接海康威视摄像头实现抓图

目录 一、下载SDK 二、拷贝示例代码 三、拷贝库文件 四、运行Demo 五、抓图业务 六、调参 ​七、发布Linux正式环境 一、下载SDK 海康开放平台 二、拷贝示例代码 三、拷贝库文件 这时候直接运行ClientDemo会报错&#xff0c;因为缺失库文件&#xff01; 四、运行Demo …...

浏览器一键重新发起请求

一、需求场景 在前端开发过程中&#xff0c;经常会需要重新请求后台进行代码调试&#xff0c;之前的常规方法是刷新浏览器页面或者点击页面进行交互&#xff0c;这样对多个请求的场景就很方便&#xff0c;但是往往很多时候我们只是单纯的想重新发起一个请求&#xff08;多个请求…...

一起来读李清照

当然先祝各位女生节日快乐&#x1f381;&#x1f381;啦​。​ 但是呢&#xff0c;今天&#xff0c;我们不聊技术&#xff0c;来聊点其他的。 大家都知道今天是三八妇女节&#xff0c;三八妇女节的是中国人的叫法&#xff0c;也叫国际妇女节。是为了纪念妇女权利的运动&#…...

找出单身狗1,2

目录 1. 单身狗12. 单身狗2 1. 单身狗1 题目如下&#xff1a; 思路&#xff1a;一部分人可能会使用对数组排序&#xff0c;遍历数组的方式去找出只出现一次的数字&#xff0c;但这种方法的时间复杂度过高&#xff0c;有时候可能会不满足要求。 有一种十分简便的方法是使用异或…...

贝叶斯优化BiLSTM分类预测(matlab代码)

贝叶斯优化BiLSTM分类matlab代码 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集&#xff0c;比例为8:1:1 数据处理: 在数据加载后&#xff0c;对数据进行了划分&#xff0c;包括训练集、验证集和测试集&#xff0c;这有助于评估模型的泛化能力。 数据标…...

Linux运维:实现光盘开机自动挂载、配置本地yum源教程

Linux运维&#xff1a;实现光盘开机自动挂载、配置本地yum源教程 一、光盘开机自动挂载1、检查光驱设备2、创建挂载点3、编辑/etc/fstab文件4、测试挂载 二、配置本地yum源(挂载光盘或ISO文件)1、挂载ISO文件2、创建YUM仓库配置文件3、清理YUM缓存并测试 &#x1f496;The Begi…...

C语言从入门到精通 第十二章(程序的编译及链接)

写在前面&#xff1a; 本系列专栏主要介绍C语言的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C语言教材&#xff0c;笔者认为重要的部分大多都会用粗体标注&#xf…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...