C/C++ BM3 链表中的节点每k个一组翻转

文章目录

  • 前言
  • 题目
  • 思路阐述
  • 代码
  • 总结

前言

这道题的关键是理解链表指针的位置;
在BM2的区间翻转基础上,多了个指针偏移,博客里面我贴图阐述一下。


题目

在这里插入图片描述

思路阐述

这道题的翻转过程参考BM2的题解,这里主要阐述一下指针移动和整体思路。

题目的要求是链表中的每k个一组翻转,也就是说每k个就是一个区间,区间的长度为k。
那对于一个输入的完整的链表,要执行区间翻转这个整体操作几次呢?我这里采用链表长度count除以区间长度,再取整的方式来得知。比如给定的链表长度为5,k值为2。那么每两个节点就是一个区间,5/2的值是2.5,取个整就是2,也就是说要翻转区间两次。
如果链表长度小于k值,那得到的次数肯定是0,我们也就不需要翻转了。

区间翻转:里面翻转的次数是几次呢?比如有3个节点(k值为3,区间长度),我们参考BM2的解法,其实只需要调整两个节点的位置就可以了,123变成321,只需要把2,3依次拿到1,和21前面即可。如果k值是2,区间长度为2,区间的节点为1,2。我们只需要把1,2的值翻转k-1=1次即可,2放到1的前面。写这个的原因是循环里面j为什么1开始而不是从0

移动新区间:
翻转一个区间之后,效果大致如下图。
我们可以看到intervalHead指针的位置在当前翻转区间的后节点,而非新的翻转区间,pre的位置还是在总链表的表头位置,而非intervalHead的前一个位置。

为什么要这样调整?因为是把总的链表分割成一个一个的子区间进行翻转,所以每次翻转的时候都要和初始情况的指针位置保持一致。因为翻转主要用到的是前序节点pre和区间链表的表头intervalHead,所以这两个指针的位置需要调整。
在这里插入图片描述

代码

/*** struct ListNode {*  int val;*  struct ListNode *next;*  ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param head ListNode类* @param k int整型* @return ListNode类思路一:区间翻转的进阶。首先确定一下这个链表的长度,每次翻转一个区间,区间翻转次数就是长度count除以k的值区间翻转*/ListNode* reverseKGroup(ListNode* head, int k) {//计算节点个数int count = CountNodeNumber(head);//添加头结点-1ListNode* selfHead = new  ListNode(-1);selfHead->next = head;//添加区间链表的表头ListNode* intervalHead = head;//添加前序节点ListNode* pre = selfHead;int temptime = count / k;for(int i=0;i<temptime;i++){//区间翻转for (int j = 1; j < k; j++) {//断开节点ListNode* temp = intervalHead->next;intervalHead->next = temp->next;//插入节点temp->next = pre->next;pre->next = temp;}//移动到新区间for(int x=0;x<k;x++){pre=pre->next;}intervalHead=intervalHead->next;}return selfHead->next;}int CountNodeNumber(ListNode* head) {int count = 0;while (head) {count++;head = head->next;}return count;}
};

总结

BM3应该是链表翻转的最终题了。
从BM1的翻转链表,到BM2的区间翻转,再到BM3的分段区间翻转。确实让我对链表有了更深刻的理解。

链表中的断链和接链的操作要注意顺序,在插入节点的时候比较重要。插入节点的时候要先把节点指向新链表,再断链表相连。

链表确定数据长度需要使用while循环来依次遍历,并使用一个int类型的变量进行计数。因为链表存放的数据在内存中是不连续的,所以不支持下表访问,也不能用sizeof这种函数。

链表一般都要有个头结点,一般头结点不包含数据,我这几道题里面加了个值为-1的节点,其实在实际操作链表的时候很有用。因为head指针的位置很容易发生改变,但是如果前面加一个头结点,我们后面对指针的操作之后,再找头结点就非常方便。

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

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

相关文章

JavaScript使用教程(二):类型、值和变量

计算机程序通过操作值&#xff08;如数值3.14&#xff09;或文本&#xff08;如“Hello World”&#xff09;来工作。编程语言中这些可以表示和操作的值被称为类型&#xff0c;而一门语言支持的类型集也是这门语言最基本的特征。程序在需要把某个值保存下来以便将来使用时&…

【Maven】报错合集

问题1&#xff1a;com.github.everit-org.json-schema:org.everit.json.schema:pom:1.12.1 failed to transfer from http://localhost:8081/repository/maven-public/ during a previous attempt 发现原来是maven的settings.xml文件配置出现了问题。首先是之前maven进阶学习时…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

2047过滤空格(C语言)

目录 一&#xff1a;题目 二&#xff1a;思路分析 三&#xff1a;代码 一&#xff1a;题目 二&#xff1a;思路分析 1.首先&#xff0c;这道题是一个字符串的问题&#xff0c;我们要先知道字符串存放在char类型的数组中的&#xff0c;并不是一个变量就可直接存放的下一个完整…

react+redux+antd-mobile 之 记账本案例

1.环境搭建 //使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 //1. Redux状态管理 - reduxjs/toolkit 、 react-redux //2. 路由 - react-router-dom //3. 时间处理 - dayjs //4. class类名处理 - classnames //5. 移动端组件库 - antd-mobile //6. 请…

PHP序列化总结1--序列化和反序列化的基础知识

序列化和反序列化的作用 1.序列化&#xff1a;将对象转化成数组或者字符串的形式 2.反序列化&#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化 这种数据形式中间会有很多空格&#xff0c;不同人有不同的书写情况&#xff0c;可能还会出现换行的情况 为此为了…

vue+web3js+metamask实现代币转账授权功能

vueweb3jsmetamask实现代币转账授权功能 介绍完整代码依赖index.vueMetaMask.vueWalletconnect.vue 踩坑点 介绍 主要实现功能&#xff1a; 连接钱包、获取余额、获取地址、转账、授权 大概效果就是下面这样 默认打开会请求连接小狐狸钱包连接后用户可以进行转账、授权等一系…

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

在处理shp数据时&#xff0c; 又是我们需要知道许多个shp字段的批量计算&#xff0c;例如计算shp的总面积、面积平均值等&#xff0c;但是单个查看shp文件的属性进行汇总过于繁琐&#xff0c;因此可以借助建模批处理来计算。 首先准备数据&#xff1a;一个含有多个shp的文件夹。…

Java日期和时间(一)

传统的日期和时间 Date 代表的是日期和时间 构造器说明public Date&#xff08;&#xff09;创建一个Date对象&#xff0c;代表的是系统当前此刻日期时间public Date&#xff08;long time&#xff09;把时间毫秒值转换成Date日期对象 import java.util.Date;public class …

【开源】基于Vue+SpringBoot的二手车交易系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手车档案管理模块2.3 车辆预约管理模块2.4 车辆预定管理模块2.5 车辆留言板管理模块2.6 车辆资讯管理模块 三、系统设计3.1 E-R图设计3.2 可行性分析3.2.1 技术可行性分析3.2.2 操作可行性3.2.3 经济…

C/C++ BM4 合并两个排序的链表

文章目录 前言题目1. 解决方案一1.1 思路概述1.2 源码 2. 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题采用两种方式&#xff0c;一种是直接插入法&#xff0c;还有一种就是递归调用。 题目 输入两个递增的链表&#xff0c;单个链表的长度为n&#xff0c;合并这两个链表…