C/C++ BM1反转链表

文章目录

  • 前言
  • 题目
  • 1.解决方案一
    • 1.1 思路阐述
    • 1.2 源码
  • 2. 解决方案二
    • 2.1 思路阐述
    • 2.2 源码
  • 总结

前言

这题是牛客网的BM1,主要涉及到链表的操作以及栈数据结构的使用。

题目

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0≤n≤10000≤n≤1000
要求:空间复杂度 O(1),时间复杂度O(n) 。

如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
Alt

示例1
输入:
{1,2,3}
返回值:
{3,2,1}

示例2
输入:
{}
返回值:
{}
说明:
空链表则输出空

1.解决方案一

1.1 思路阐述

先不考虑链表,我们只考虑数据。对于1,2,3的输入,我想让其输出3,2,1。
这个就类似于栈的先进后出。
那么现在定义栈,存放链表的节点数据,全部存放完之后,再出栈即可。
因为涉及到空链表的情况,所以要单独判断链表是否为空。

C++中使用vector或者stack。vector的适用性更广,包含了stack。
vector中使用back()获取栈顶元素,我这里使用reverse函数,直接倒序,即123变成321,再依次遍历赋值输出。

1.2 源码

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <cstdio>
#include <cstdlib>
#include <iterator>
#include <stack>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    ListNode* ReverseList(ListNode* head) {
        // write code here
        if (head == nullptr)//如果空则直接返回
            return head;
        vector<ListNode*>Contain;//存放链表节点的vector容器
        while (head != nullptr) {
			//容器不为空则依次入栈
            Contain.push_back(head);
            head = head->next;

        }
        //反转容器
        reverse(Contain.begin(), Contain.end());
        ListNode* newHead = Contain[0];
        ListNode* cur = newHead;

        for (int i = 1; i < Contain.size(); i++) {
            cur->next = Contain[i];
            cur = cur->next;
        }
        cur->next = nullptr;//最后一个节点的下一节点指向置空,避免循环链表
        return newHead;
    }
};

2. 解决方案二

2.1 思路阐述

对于给定的顺序链表,将每个节点的后继节点作为当前节点的前置节点,即可完成倒置。
对于1,2,3。我需要将2的下一个节点指向1,新的链表头就是2。
将3的下一个节点指向2,2同时又指向1,那么链表就完成了倒置。

这里我就要用到一个节点用来保存新的表头节点,同时节点与节点之间原来的关系要打乱,要断开原来的先后关系,重新构建。

下面的代码,首先定义了一个新的表头节点pre,置空。将下一个要翻转的表头保存;遍历给定的链表,找到第一个表头p,将这个表头的下一个节点p->next指向新的表头节点p。同时这个表头p原来指向的下一个节点,作为新的倒置表头。新的表头节点pre从空节点指向要翻转表的表头p。

重复上面的步骤,最终得到一个翻转的链表。
这个方法主要是断开原来的链表,组建新的链表的过程。

2.2 源码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
#include <cstdio>
#include <cstdlib>
#include <iterator>
#include <stack>
#include <vector>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* ReverseList(ListNode* p) {
         ListNode* pre = nullptr;
     while (p) { // 判断链表是否已经到结尾
         ListNode* t = p->next; // 保留下一个即将翻转的表头
         p->next = pre; // 将现在要翻转的节点的后继指向前一个节点 pre
         pre = p; // 现在的 P 成为下一个前继节点
         p = t; // p 成为下一个要翻转的节点
     }
     return pre;
 
    }
};

总结

本篇博客介绍了两种方式,一种是依赖数据结构本身,使用栈的特性。另一种是断链表,组新链表的方式,语言描述有点搞,具体还是参考代码为好。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arduino开发实例-液体流量测量

液体流量测量 文章目录 液体流量测量1、流量传感器介绍2、硬件准备及接线3、代码实现在本文中,将介绍如何流量传感器进行测量液体流量。 流量传感器用于测量液体流速。 市场上有不同类型的流量传感器,在本文中,我们将使用霍尔效应流量传感器。 这些类型的流量传感器是非侵入…

不是私域难做,是我们做私域的方法该换了!

最近&#xff0c;有一些声音在不断变多&#xff1a;私域越来越难做了&#xff01;许多过去做私域的成功经验&#xff0c;今天好像都不奏效了。 在业绩层面上&#xff0c;很多企业一开始还能通过大量拉新、信息轰炸这种“博概率”的方式获得销量&#xff0c;但时间一长&#xf…

Tomcat远程调试

windows环境 写一个 startup-debug.bat&#xff0c;指定tomcat的根目录&#xff0c;端口自己定义 rem *******设置Tomcat目录*******-- set CATALINE_HOMED:\asd\A8-2\tomcat d: rem 8787为可用端口,为远程调试监听端口-- cd %CATALINE_HOME%/bin set JPDA_ADDRESS8787 set J…

DriveWorks Solo捕获参数(三)

捕获参数 - 木门和矩形窗 木质门 下一个组件是木门本身。除了尺寸之外&#xff0c;门还具有需要控制的功能。 让我们首先捕获尺寸。 通过单击“捕获资源管理器”中的标题来激活“捕获的模型”部分。 双击任务窗格树中的模型木门以在 SOLIDWORKS 中将其打开。捕获以下尺寸。…

【Python目标识别】Yolo v5-7.0版本中文标签显示方法(附字体链接)

Yolo的程序之前已经定制化输出过了&#xff0c;但是最近业主突然想要中文的标签&#xff0c;所以赶紧去修改了一下源代码&#xff0c;从网上发现很多资料都改这改那&#xff0c;搞四五个文件结果还没成功。所以自己研究了一下&#xff0c;现在已经完美解决了。今天就和大家分享…

转移mysql中的数据

目录 1 mysqldump 2 将数据库中的数据转换为一个sql文件 3 执行sql文件 1 mysqldump 转移数据需要用到mysqldump。默认情况下mysqldump会自动被安装上&#xff0c;如果没有用不了&#xff0c;建议重新安装一下 参考 mysqldump 命令安装:_mob649e8162c013的技术博客_51…

0155 - Java 数组

1 数组介绍 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。 即&#xff1a;数(数据)组(一组)就是一组数据 2 数组的使用 2.1 使用方式一 2.2 使用方式二 3 数组使用注意事项和细节 数组是多个相同类型数据的组合&#xff0c;实现对这些数据…

为你自己学laravel - 15 - model的更新和删除

为你自己学laravel。 model的部分。 这一次讲解的是model当中怎么从数据库当中更新数据和删除数据。 先从数据库当中抓出来资料。 当然我们是使用php artisan tinker进入到终端机。 我们的做法是想要将available这个栏位修改成为true。 第一种更新方法 上面我们就是修改了对…

智能优化算法应用:基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于学生心理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.学生心理学算法4.实验参数设定5.算法…

RocketMQ系统性学习-RocketMQ原理分析之Broker接收消息的处理流程

Broker接收消息的处理流程&#xff1f; 既然要分析 Broker 接收消息&#xff0c;那么如何找到 Broker 接收消息并进行处理的程序入口呢&#xff1f; 那么消息既然是从生产者开始发送&#xff0c;消息是有单条消息和批量消息之分的&#xff0c;那么消息肯定是有一个标识&#…

go语言函数二、init函数定义与作用

go语言init函数定义与作用 在go语言中&#xff0c;每一个源文件都可以包含一个init函数&#xff0c;这个函数会在main函数执行前&#xff0c;被go运行框架调用&#xff0c;注意是在main函数执行前。 package main import ("fmt" )func init() {fmt.Println("i…

石器时代H5小游戏架设教程

本文讲解石器时代 H5 之恐龙宝贝架设教程&#xff0c;想研究 H5 游戏如何实现&#xff0c;那请跟着此次教程学习在拥有小游戏源码的情况下该如何搭建起来 开始架设 1. 架设条件 石器时代架设需要准备&#xff1a; 一台linux 服务器&#xff0c;建议 CentOs 7.6 版本&#xf…

数据安全扫描仪荣膺网络安全优秀创新成果大赛优胜奖 - 凸显多重优势

近日&#xff0c;由中国网络安全产业联盟&#xff08;CCIA&#xff09;主办、CCI数据安全工作委员会中国电子技术标准化研究院等单位承办的“2023年网络安全优秀创新成果大赛”获奖名单公布。天空卫士数据安全扫描仪&#xff08;DSS&#xff09;产品获得创新成果大赛优胜奖。 本…

C++中的RAII机制及其智能指针的应用

一、引言 C是一种高效且功能强大的编程语言&#xff0c;但内存管理一直是其一大挑战。为了简化资源管理&#xff0c;C引入了RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制。本文将深入探讨RAII的原理&#xff0c;并通过智能指针这一具体实现来展示…

云原生之深入解析Thanos在EKS多集群架构上存储多个集群Prometheus

一、前言 随着 HiredScore 的产品和客户群越来越大&#xff0c;已经开始向 Kubernetes 过渡并迅速采用它&#xff0c;它是我们重要的障碍之一&#xff0c;也可能是最大的监控基础设施。我们在使用 Prometheus / Grafana 堆栈进行监控方面有一些经验&#xff0c;了解到希望创建…

如何用 CleanMyMac 来保护 Mac 隐私

大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好。 在我们使用MacBook上的自带浏览器-Safari&#xff08;或者一些其他浏览器&#xff09;进行网页浏览的时候&#xff0c;往往会留下一些痕迹。如果这些痕迹涉及一些敏感数据信息的话&#xff0c;那么我们肯…

1_js基本简介数据类型变量的使用

1. 编程语言简介 1.1 计算机编程语言 计算机编程语言是程序设计的最重要的工具&#xff0c;它是指计算机能够接受和处理的、具有一定语法规则的语言。从计算机诞生&#xff0c;计算机语言经历了机器语言、汇编语言和高级语言几个阶段。 高级语言&#xff1a;JavaScript&#x…

Flink Table API 与 SQL 编程整理

Flink API总共分为4层这里主要整理Table API的使用 Table API是流处理和批处理通用的关系型API&#xff0c;Table API可以基于流输入或者批输入来运行而不需要进行任何修改。Table API是SQL语言的超集并专门为Apache Flink设计的&#xff0c;Table API是Scala和Java语言集成式…

Android Studio: 解决Gradle sync failed 错误

文章目录 1. 前言2. 错误情况3. 解决办法3.1 获取gradle下载地址3.2 获取gradle存放目录3.3 替换并删除临时文件3.4 触发Try Again 4. 执行成功 1. 前言 今天调试项目&#xff0c;发现新装的AS&#xff0c;在下载gradle的过程中&#xff0c;一直显示连接失败&#xff0c;Gradl…

【MyBatis学习笔记】MyBatis基础学习

MyBatis基础 MyBatis简介MyBatis特性MyBatis下载和其他持久化层技术对比 核心配置文件详解默认的类型别名 搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能 MyBatis获取参数值的两种方式&am…