[C++刷题之旅]反转链表

2023/11/30 9:39:04

🌸心有所向,日复一日,必有精进

🌸专栏:C++刷题之旅

🌸作者:早凉


目录

题目一:反转链表 

【题目链接】

【题目描述】

【解题思路】

【代码实现】 

进阶:链表中指定区间反转

【题目链接】 

【题目描述】​编辑

【解题思路】 

【代码实现】  


题目一:反转链表 

【题目链接】

题目反转链表_牛客题霸_牛客网

【题目描述】

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

数据范围: 0≤n≤1000

要求:空间复杂度 O(1) ,时间复杂度 O(n) 。

如当输入链表{1,2,3}时,

经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

【解题思路】

反转单链表,如果创建一个新的链表,遍历旧链表头插是可以解决问题,但是题目中要求了O(1)的空间复杂度,这就意味着,我们不能在开辟额外空间;我们可以利用三个指针来解决这个问题;为什么用三个指针,就是为了让当前指针既能把前面一个结点找到链接上,也能让当前指针找到之前的后继结点;

【代码实现】 

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
		ListNode*pre,*cur,*nex;
		pre = nullptr;
		cur = nex = pHead;
		while(cur)//注意终止条件
		{
			nex = cur->next;
			cur->next = pre;
			pre = cur;
			cur = nex;
		}
		return pre;//注意头结点
    }
};

 其实这样也可以看成在新生成一个链表进行头插,这也可以是一种新思路,具体如下图:

 当然我们还可以使用栈结构来解决问题。

 接下来是进阶:

进阶:链表中指定区间反转

【题目链接】 

 
链表内指定区间反转_牛客题霸_牛客网
 【题目链接】​​​​​​​

【题目描述】

【解题思路】 

 这道题和上一道题是一样的,我们只需要找到一个指定区间,指定区间的使用第一题的反转就好了,然后记录下区间前后指针链接起来就好啦;这道题可以增加一个虚拟头结点,这样反转首结点会方便一点,反转后返回虚拟头结点的下一个结点;

【代码实现】  

    ListNode* reverseBetween(ListNode* head, int m, int n) {
          //加个表头
        ListNode* res = new ListNode(-1);
        res->next = head;
        //前序节点
        ListNode* pre = res;
        //当前节点
        ListNode* cur = head;
        //找到m
        for(int i = 1; i < m; i++){
            pre = cur;
            cur = cur->next;
        }
        //从m反转到n
        for(int i = m; i < n; i++){
            ListNode* temp = cur->next;
            cur->next = temp->next; 
            temp->next = pre->next;
            pre->next = temp;
        }
        //返回去掉表头
        return res->next;
    }


http://www.jnnr.cn/a/537596.html

相关文章

【Java】Java核心要点总结 65:TreeSet 两种排序

文章目录 1. Comparable 和 Comparator区别比较2. TreeSet有两种实现指定排序规则的方式&#xff1a; 1. Comparable 和 Comparator区别比较 Comparable 是排序接口&#xff0c;若一个类实现了Comparable接口&#xff0c;就意味着“该类支持排序”。Comparator 是比较器&#x…

[nlp] OPT与GPT-2的差异

Meta AI 开源1750亿参数大模型- OPT,FlagAI一键调用! - 知乎简介Meta AI 开源 OPT系列模型,其中最大模型1750 亿参数(需申请访问权限)媲美 GPT-3。OPT系列模型包括了多组不同参数规模的模型权重,如图: OPT开源了一系列大模型,但是实际调用这些模型有很高的技术门槛。为…

【电源设计】18650电池电源串并联设计——改变电压或容量

有时我们有需要改造电池电源的需要&#xff0c;比如增大容量&#xff0c;增大电压之类的&#xff0c;本文介绍18650锂电池&#xff0c;以及如何用18650锂电池串并联设计电源&#xff0c;达到增大容量或者增大电压的效果&#xff1a; 目录 一、18650锂电池基本知识&#xff1a…

【数据分析之道-Matplotlib(九)】Matplotlib棉棒图

文章目录 专栏导读1、Matplotlib棉棒图stem()基本语法2、Matplotlib棉棒图stem()定义样式2.1linefmt参数2.2markerfmt参数2.3举例一&#xff1a;直线样式2.4举例二&#xff1a;圆点样式 3、棉棒图案例实战3.1绘制每月销量的棉棒图3.2绘制每月销量与平均销量之差 专栏导读 ✍ 作…

指定字符串数组中每个元素sn的长度L如果sn长度比L短,则补充空格,且sn居中如果sn长度比L长,则保留sn左侧L个字符

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定字符串数组中每个元素sn的长度L 如果sn长度比L短&#xff0c;则补充空格,且sn居中 如果sn长度比L长&#xff0c;则保留sn左侧L个字符 [太阳]选择题 下列代码最后输出的结果是&#xff1f…

基于Java电子竞技管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

HJ26 字符串排序

题目&#xff1a; HJ26 字符串排序 题解&#xff1a; 规则 1 &#xff1a;英文字母从 A 到 Z 排列&#xff0c;不区分大小写。 统一转换&#xff0c;通过减去对应字母的起始值&#xff0c;得到一个相对值&#xff0c;抹平大小写&#xff0c;例如&#xff1a;B - A&#xff…

FFmpeg 内存模型分析

标题 1. 内存模型图2. 分析流程3.追溯本源————源码分析3.1 AVPacket队列 什么时候生成的&#xff1f; 4 .AVPacket和AVFrame相关操作API5. av_read_frame源码分析 1. 内存模型图 2. 分析流程 我们解复用后,媒体流数据就会被分离开来,分别生成对应AVPacketList,然后通过av_…

Python--序列

Python--序列 <font colorblue>一、定义<font colorblue>二、索引<font colorblue>1.从左往右的索引&#xff1a;索引值从0开始递增<font colorblue>2.从右往左的索引&#xff1a;从-1开始递减 <font colorblue>三、切片<font colorblue>四…

DJ8-1 shell 的启动和终止、重定向、管道

目录 8.1 shell 的启动和终止 8.2 输入输出重定向 8.2.0 标准输入输出 8.2.1 输出重定向 > 8.2.2 输入重定向 < 8.2.3 常见输入输出重定向形式 8.2.4 标准错误输出重定向 8.3 管道 Linux 系统中的 shell 具有两大功能&#xff1a; 是一个命令解释器&…

Hive 库表相关操作

1、Hive内部表和外部表 1.内部表&#xff1a;未被external修饰&#xff1b;外部表&#xff1a;被external修饰。 区别&#xff1a; &#xff08;1&#xff09;内部表数据由Hive自身管理&#xff0c;外部表数据由HDFS管理&#xff1b; &#xff08;2&#xff09;内部表数据存…

分布式安装配置spark-3.2.3

Spark是一个基于内存的大数据计算框架&#xff0c;可以与Hadoop集成&#xff0c;提供更快速的数据处理能力。本文将介绍如何在三个Ubuntu系统上搭建一个Spark集群。 主要步骤包括&#xff1a; 准备工作&#xff1a;下载安装包&#xff0c;设置环境变量&#xff0c;解压安装包…

【备战秋招】每日一题:4月8日美团春招第二题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第二题-必经之路 在线评测链接:P1167 题目内容 塔子哥的班主任最近组织了一次户外拓展活动&#xff0c;让班里的同学们一起去爬山。在路上&#xff0c;塔子哥看到了一棵漂…

C++(9):顺序容器

顺序容器概述 所有顺序容器都提供了快速顺序访问元素的能力。 vector//可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢 deque//双端队列。支持快速随机访问。在头尾位置插入/删除速度很快 list//双向链表。只支持双向顺序访问。在list中任何位置进…

提示学习soft prompt浅尝,启发了p-tuing

一、前言 在高质量标注数据稀缺的工业界来说&#xff0c;少样本学习或者零样本学习的方法特别受欢迎&#xff0c;后面出现过一些少样本和零样本的方法&#xff0c;例如对比学习和prompt等&#xff0c;主流prompt的工作分为离散型和连续型模板。离散型主要还是插入bert特殊的tok…

JavaScript 发展的前世今生

专栏介绍 本专栏主要用作于开放性知识点分享学习&#xff0c;其主要知识点范围是 以围绕 原生 JavaScript 语法 从基础知识到高阶语法阶段的学习分享。 导语&#xff1a; 既然博主&#xff0c;计划将此专栏打造为 JavaScript 的知识点学习分享集结地。所以&#xff0c;本章节就…

短视频seo源码部署--LINUX环境

抖音矩阵系统源码/抖音seo矩阵系统/抖音账号矩阵源码/短视频seo源码部署 *基于PHP语言&#xff0c;linux环境&#xff0c;MVC框架进行研发&#xff0c;开源部署 开源性质使得用户可以根据自己的需求对其进行二次开发和定制。然而&#xff0c;对于该软件的部署却是一项非常关键…

JS 刷新保持iframe页面并支持浏览器前进后退

参考资料 html5新特性&#xff1a;利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题击按钮切换iframe的src&#xff0c;这个路径如何不会被记录到history中&#xff1f;iframe 后退 浏览器history 问题ajax与HTML5 history pushState/replaceState实例 目…

基于html+css的图展示131

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

LeetCode 2481. 分割圆的最少切割次数

【LetMeFly】2481.分割圆的最少切割次数 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-cuts-to-divide-a-circle/ 圆内一个 有效切割 &#xff0c;符合以下二者之一&#xff1a; 该切割是两个端点在圆上的线段&#xff0c;且该线段经过圆心。该切割是一端…
最新文章