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

news2025/1/18 6:47:55

文章目录

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

前言

这道题的关键是理解链表指针的位置;
在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);
        //添加头结点-1
        ListNode* 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.coloradmin.cn/o/1345213.html

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

相关文章

redhat 8 安装openstack

redhat 8 安装openstack 1、安装文档2、redhat 8 安装openstack3、使用openstack 1、安装文档 openstack官方安装文档 https://docs.openstack.org/install-guide/ 2、redhat 8 安装openstack 3、使用openstack

【C/C++笔试练习】sort排序、STL容器、vector的特性、一级容器、迭代器失效、异常捕获、动态转换、统计每个月兔子的总数、字符串通配符

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;sort是不稳定排序&#xff08;2&#xff09;存放即有序的STL容器&#xff08;3&#xff09;连续储存的STL容器&#xff08;4&#xff09;vector的特性&#xff08;5&#xff09;一级容器&#xff08;6&#xff09;unorde…

2、gdb常用功能2

1.4、线程 程序避免不了涉及到多线程.常用指令如下. 命令简写形式说明info thread显示当前进程内所有线程信息thread 切换到num线程thread find 寻找regexp在gdb中的idinfo address 结合上述图片理解&#xff0c;第一列的id是gdb内部为线程排序的一个id&#xff0c;第三列中…

Redis:原理速成+项目实战——Redis的Java客户端

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis常见命令&#xff08;数据结构、常见命令总结&#xff09; &#x1f4da;订阅专栏&…

算法基础之最短编辑距离

最短编辑距离 核心思想 &#xff1a; 线性dp 集合定义 &#xff1a; f[i][j]为操作方式的最小值 集合计算 : 三种操作 取最小 ① 删除 : 将a[i]删掉 使ab相同 –> f[i-1][j] 1 f[i][j]② 增添 : 在a[i]后加上一个数 使ab相同 –> f[i][j-1] 1 f[i][j]③ 替换 : 将a[…

【unity学习笔记】捏人+眨眼效果+口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

基于FPGA的数字电路(PWM脉宽调制)

一.PWM的制作原理 假如我们有一个锯齿波&#xff0c;然后在锯齿波上设置一个阈值&#xff08;黑色水平虚线&#xff09;&#xff0c;凡是大于该阈值时输出均为高电平&#xff0c;反之则为低电平&#xff0c;这样我们是不是就得到一个PWM信号呢&#xff1f;如果我们想调整它的占…

数据治理:释放数据价值的关键

随着数字化时代的到来&#xff0c;数据已成为组织和企业最重要的资产之一。然而&#xff0c;数据的快速增长和复杂性也给数据管理带来了巨大的挑战。为了确保数据的质量、安全性和合规性&#xff0c;数据治理已成为组织和企业必须面对的重要问题。数据治理是数据要素市场建设的…

OSG绘制视锥体(升级版)

OSG绘制视锥体&#xff0c;这一篇增加设置相机参数接口&#xff0c;支持通过eye、center、up设置相机参数。 代码如下&#xff1a; #include "stdafx.h" #include <osgViewer/Viewer> #include <osg/ShapeDrawable> #include <osg/Geode> #includ…

SkyWalking UI 修改发布Nginx

文章目录 SkyWalking UI修改图标修改路由发布到Nginx添加认证修改路由模式vite.config.ts添加baseNginx配置 SkyWalking UI skywalking-booster-ui下载地址 修改图标 替换 logo.svg 修改路由 router - data - index.ts 发布到Nginx 添加认证 # 安装 yum install -y h…

电子学会C/C++编程等级考试2022年12月(八级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生理周期(2022.12) 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容…

【网络安全常用术语解读】SCAP详解

本文主要介绍什么是SCAP&#xff0c;SCAP的产生背景是怎样的&#xff0c;SCAP有什么用途&#xff0c;有哪些组件&#xff0c;各个组件的用途是什么&#xff1f; SCAP产生背景 由于计算机和网络技术的快速发展&#xff0c;越来越多的软件和系统被应用到企业和机构中&#xff0c…

安装与部署Hadoop

一、前置依赖1、java 一、前置依赖 1、java 需要安装java rz tar -zxvf jdk-8u381-linux-x64.tar.gz -C / ln -s /jdk1.8.0_381/ /jdk # rm jdk-8u381-linux-x64.tar.gzvim /etc/profile export JAVA_HOME/jdk export PATH$PATH:$JAVA_HOME/bin # source /etc/profile ln -s…

Strateg策略模式(组件协作)

策略模式&#xff08;组件协作&#xff09; 链接&#xff1a;策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现…

2023.12.30 Pandas操作

目录 1. pandas基础 1.1 pandas的基本介绍 1.2 pandas基础使用 2. pandas的数据结构 2.1 series对象 2.2 使用列表,自定义索引,字典,元组方式创建series对象 2.3 Series对象常用API 2.4 Series 对象的运算 1. pandas基础 1.1 pandas的基本介绍 Python在数据处理上独步天下…

SQL server Profiler的使用

在SQL server management studio 中 的工具下 选择SQL server Profiler 对sql进行过滤

计算机网络【EPOLL 源码详解】

IO多路复用 在以前&#xff0c;传统的网络编程是多线程模型&#xff0c;一个线程单独处理一个请求。 然而&#xff0c;线程是很昂贵的资源&#xff1a; 线程的创建和销毁成本很高&#xff0c;linux的线程实际上是特殊的进程&#xff1b;因此通常会使用线程池来减少线程创建和…

React中super() 和 super(props) 有什么区别?

面试官&#xff1a;super() 和 super(props) 有什么区别&#xff1f; 一、ES6 类 在 ES6 中&#xff0c;通过 extends 关键字实现类的继承&#xff0c;方式如下&#xff1a; class sup {constructor(name) {this.name name;}printName() {console.log(this.name);} }class s…

Android 13 - Media框架(27)- ACodec(五)

前面几节我们了解了OMXNodeInstance是如何处理setPortMode、allocateBuffer、useBuffer的&#xff0c;这一节我们再回到ACodec&#xff0c;来看看 ACodec start 的其他部分。 我们首先来回顾一下&#xff0c;ACodec start 的状态切换以及处理的事务&#xff0c;我们用一张不太准…

GBASE南大通用数据库-GBase 8a MPP Cluster之木桶效应降低技术

几千年前&#xff0c;因为金属冶炼、塑料成型技术不成熟&#xff0c;盛产在水源丰富的江南一带的用来洗衣服、盛水的容器都是用那种木板与竹钉合围并在外部用绳索、皮条之类紧箍起来的木桶&#xff0c;名字叫箍木桶。一个木桶由于老化或者损坏&#xff0c;桶上的个别木板发生断…