BM2 链表内指定区间反转,为什么链表要new一个结点?

news2024/11/19 1:21:02

链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com)

思路就是,把需要反转的结点放入栈中,然后在弹出来。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
 #include<stack>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        stack<int>s;
        int cnt=1;
        ListNode* pre = head;//前一个结点
        ListNode* cur = head;//当前节点
        ListNode* res = head;//如果从头节点开始反转,需要重新弄一个头节点以便返回i
        ListNode* tmp = head;//临时结点
        ListNode T(0);
        if (m == 1)
        {
            while (cnt <= n)
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            ListNode*T = new ListNode(s.top());
            res = T;
            tmp = res;
            s.pop();
            while (!s.empty())
            {
                ListNode*T = new ListNode(s.top());
                tmp->next = T;
                s.pop();
                tmp = tmp->next;
            }
            while (cur)
            {
                tmp->next = cur;
                tmp=cur;
                cur = cur->next;
            }
            return res;
        }
        else
        {
           while (cnt != m)//这个while世找到m
            {
                cnt++;
                pre = cur;
                cur = cur->next;
            }
            while (cnt <=  n)//入栈
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            //cout<<cur->val<<endl;
            while (!s.empty())//重新连接
            {
                //cout<<s.top()<<endl;
                ListNode*T = new ListNode(s.top());
                pre->next = T;
                s.pop();
                pre = pre->next;
                //cout<<pre->val<<endl;
            }
            //cout<<pre->val<<endl;
            while (cur)//连n之后的
            {
                pre->next = cur;
                pre=cur;
                //cout<<pre->val<<endl;
                cur = cur->next;
            }
            return head;
        }
        // write code here
    }
};

下面有一个错误代码,与上面不一的地方在于

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        stack<int>s;
        int cnt=1;
        ListNode* pre = head;
        ListNode* cur= head;
        ListNode *res=head;
        ListNode* tmp=head;
        if (m == 1)
        {
            while (cnt <= n)
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            res = &ListNode(s.top());
            tmp = res;
            s.pop();
            while (!s.empty())
            {
                tmp->next = &ListNode(s.top());
                s.pop();
                tmp = tmp->next;
            }
            while (cur)
            {
                tmp->next = cur;
                cur = cur->next;
            }
            return res;
        }
        else
        {
            while (cnt != m)
            {
                cnt++;
                pre = cur;
                cur = cur->next;
            }
            while (cnt <= n)
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            while (!s.empty())
            {
                pre->next = &ListNode(s.top());
                s.pop();
                pre = pre->next;
            }
            while (cur)
            {
                tmp->next = cur;
                cur = cur->next;
            }
            return head;
        }
        // write code here
    }
}
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
 #include<stack>
ListNode T(0);
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        stack<int>s;
        int cnt=1;
        ListNode* pre = head;
        ListNode* cur = head;
        ListNode* res = head;
        ListNode* tmp = head;
        //ListNode T(0);
        if (m == 1)
        {
            while (cnt <= n)
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            T=ListNode(s.top());
            res = &T;
            tmp = res;
            s.pop();
            while (!s.empty())
            {
                T=ListNode(s.top());
                tmp->next = &T;
                s.pop();
                tmp = tmp->next;
            }
            while (cur)
            {
                tmp->next = cur;
                cur = cur->next;
            }
            return res;
        }
        else
        {
            while (cnt != m)
            {
                cnt++;
                pre = cur;
                cur = cur->next;
            }
            while (cnt <= n)
            {
                s.push(cur->val);
                cnt++;
                cur = cur->next;
            }
            //cout<<cur->val<<endl;
            while (!s.empty())
            {
                //cout<<s.top()<<endl;
                T=ListNode(s.top());
                pre->next = &T;
                s.pop();
                pre = pre->next;
                //cout<<pre->val<<endl;
            }
            //cout<<pre->val<<endl;
            while (cur)
            {
                pre->next = cur;
                pre=cur;
                //cout<<pre->val<<endl;
                cur = cur->next;
            }
            
            return head;
        }
        // write code here
    }
};

 

 一个是new一个结点,另一个是建一个结点然后取地址,错误的代码在于,

就是错误代码,我想的是自己创的局部变量T,这个对象每次都是新的,结果在VS2022上调试,一步步发现,原来每次新建的T居然是一个地址!!因为链表里已经加入了之前的T的这个地址,这直接导致链表发生错误,以第一个用例为例,本意是想实现1-4-3-2,结果最后只有1-2

因为在循环时,首先是1-4,在创建3这个节点时,由于是4的地址,所以就把4覆盖了,输出1-3,而不是1-4-3.
链表申请新节点要new。这样每次地址都不一样就连起来了。



下面讲一种,加入一个虚拟节点(哨兵)的做法,之所以这样是可以当从头节点开始转变时,代码不用特判。

 

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode* res=new ListNode(0);//虚拟节点
        res->next=head;
        ListNode* pre=res;
        ListNode* cur=head;
        ListNode* beg=head;
        ListNode* en=head;
        ListNode* tmp;
        for(int i=1;i<m;i++)
        {
           pre=beg;
           beg=beg->next;
        }
        for(int i=1;i<n;i++)
        {
           en=en->next;
        }
        cur=beg->next;
        beg->next=en->next;
        pre->next=en;
        pre=beg;
        while(pre!=en)
        {
           tmp=cur->next;
           cur->next=pre;
           pre=cur;
           cur=tmp;
        }
        return res->next;
        // write code here
    }
};

第三个方法

 

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode* res=new ListNode(0);//虚拟节点
        res->next=head;
        ListNode* pre=res;
        ListNode* cur=head;
        ListNode* beg=head;
        ListNode* tmp;
       for(int i=1;i<m;i++)
       {
         pre=beg;
         beg=beg->next;
       }
       tmp=beg->next;
       for(int i=m+1;i<=n;i++)
       {
          cur=tmp;
          tmp=tmp->next;
          beg->next=tmp;
          cur->next=pre->next;
          pre->next=cur;
       }
       return res->next;
        // write code here
    }
};



 


 

 

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

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

相关文章

7-42 整型关键字的散列映射

题目链接&#xff1a;这里 题目大意&#xff1a;就是写一个线性探测的散列 然鹅&#xff0c;我不会写(?)我一共错了两个地方 有冲突的情况下&#xff0c;就是线性探查然后往后找&#xff0c;但是我之前写的是t&#xff0c;应该是t (t1)%p;…在有重复关键字的时候&#xff0c…

Android studio 2022.3.1 鼠标移动时不显示快速文档

在使用技术工具的过程中&#xff0c;我们时常会遇到各种各样的问题和挑战。最近&#xff0c;我升级了我的Android Studio到2022.3.1版本&#xff0c;但是在使用过程中&#xff0c;我碰到了一个让我颇为困扰的问题&#xff1a;在鼠标移动到类名或字段上时&#xff0c;原本应该显…

不同规模的测试团队分别适合哪些测试用例管理工具?测试用例管理工具选型指南

随着软件系统规模的持续增大&#xff0c;业务复杂度的持续增加&#xff0c;软件测试的复杂度也随之越来越大。软件测试工作的复杂性主要体现在测试用例的编写、维护、执行和管理方面。而创建易于阅读、维护和管理的测试用例能够显著减轻测试工作的复杂性。 本篇文章将较为系统的…

SpringBoot Cache

一、基本概念 Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; • EHCache • Caffeine …

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…

裂缝检测,只依赖OPENCV,基于YOLO8S

裂缝检测&#xff0c;只依赖OPENCV&#xff0c;YOLOV8S 现在YOLOV8S训练目标非常方便&#xff0c;可以直接转换成ONNX让OPENCV调用&#xff0c;支持C/PYTHON&#xff0c;原理很简单&#xff0c;自己找博客&#xff0c;有兴趣相互交流

爆肝spring源码笔记

1.总览 首先学习spring源码 的大纲如下 图1.1为主要学习 内容其中 容器 AOP占百分之六七十 然后学完sping源码 再学springmvc源码就简单很多 图1.2中指出了springmvc中父子工厂的事务冲突问题 这个在springboot中由于引入了内置的 tomcat后解决 后面会讲 然后sprin…

在当今信息化社会中的安全大文件传输

随着科技的不断进步&#xff0c;数据已经成为各个领域和行业的宝贵财富。然而&#xff0c;随之而来的数据传输和交换问题也成为一个日益突出的挑战。在这篇文章中&#xff0c;我们将探讨在当今信息化社会中的安全大文件传输的重要性&#xff0c;以及如何应对传统传输方式所面临…

工程管理与工作流

1 统一开发环境/ 协作工具 你知道开发环境指的是什么吗&#xff1f; 开发环境&#xff1a; 工程运行环境、开发工具/ 编辑器 、开发依赖环境、 配置文件 软件环境&#xff1a; “仿真预演”环境 Staging 生产环境前最终验证、 这一环境尽可能的仿真了真实的生产环境 、另一个…

Django REST framework实现api接口

drf 是Django REST framework的简称&#xff0c;drf 是基于django的一个api 接口实现框架&#xff0c;REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …

Day 81:数据集读取与存储

代码&#xff1a; package dl;import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List;/*** Manage the dataset.** author Fan Min min…

动态规划之路径问题

路径问题 1. 不同路径&#xff08;medium&#xff09;2. 不同路径II&#xff08;medium&#xff09;3. 礼物最大值&#xff08;medium&#xff09;4. 下降路径最小和&#xff08;medium&#xff09;5. 最⼩路径和&#xff08;medium&#xff09;6. 地下城游戏&#xff08;hard&…

Python Opencv实践 - 图像直方图均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像直方图计算 #cv.calcHist(images, channels, mask, histSize, ranges, hist, accumulate) #images&…

Linux网络编程:多路I/O转接服务器(select poll epoll)

文章目录&#xff1a; 一&#xff1a;select 1.基础API select函数 思路分析 select优缺点 2.server.c 3.client.c 二&#xff1a;poll 1.基础API poll函数 poll优缺点 read函数返回值 突破1024 文件描述符限制 2.server.c 3.client.c 三&#xff1a;epoll …

光谱成像系统视觉均匀校准积分球光源

数字相机的光谱灵敏度是成像传感器、光学透镜、滤光片以及相机内部图像处理过程等诸多因素的综合结果。即使是同一台相机&#xff0c;采用不同的光学镜头和不同的滤光片&#xff0c;由于光学系统的结构和光学材料的透过率不同&#xff0c;导致整个成像系统的光谱灵敏度也有所差…

Linux系统安全:NAT(SNAT、DNAT)

目录 一.NAT 二.SNAT 三.DNAT 一.NAT NAT: network address translation&#xff0c;支持PREROUTING&#xff0c;INPUT&#xff0c;OUTPUT&#xff0c;POSTROUTING四个链 请求报文&#xff1a;修改源/目标IP&#xff0c; 响应报文&#xff1a;修改源/目标IP&#xff0c;根据…

Maven 一键部署到 SSH 服务器

简介 利用 Maven Mojo 功能一键部署 jar 包或 war 包到远程服务器上。 配置 在 maven 的setting.xml 配置服务器 SSH 账号密码。虽然可以在工程的 pom.xml 直接配置&#xff0c;但那样不太安全。 <servers><server><id>iq</id><configuration&…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布&#xff0c;将不再为胖胎电动自行车提供保险&#xff0c;因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升&#xff0c;胖胎也变得更受欢迎。但问题是&#xff0c;胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …

优化时间流:区间调度问题的探索与解决

在浩如烟海的信息时代&#xff0c;时间的有效管理成为了一门不可或缺的艺术。无论是生活中的琐事&#xff0c;还是工作中的任务&#xff0c;时间都在无声地流逝&#xff0c;挑战着我们的智慧。正如时间在日常生活中具有的宝贵价值一样&#xff0c;在计算机科学领域&#xff0c;…

Java IO流(五)Netty实战[TCP|Http|心跳检测|Websocket]

Netty入门代码示例(基于TCP服务) Server端 package com.bierce.io.netty.simple; import io.netty.bootstrap.ServerBootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGro…