力扣力扣力:206. 反转链表

news2024/10/18 8:23:45

leetcode链接:206. 反转链表

题目描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

 

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

 

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

 

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

分析思路:

第一反应是分类讨论

1.如果是空则直接返回

2.如果只有一个也直接返回

3.大于等于2个元素则进行反转

        1)可以new一个链表来倒着存值

        2)在原链表上进行操作

  实现1

在原链表上进行修改:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr)
        {
            return head;
        }
        else
        {
            ListNode* cur = head;
            ListNode* prev = nullptr;
            while(cur)
            {   
                ListNode* nextnode = cur->next;
                cur->next = prev;
                prev = cur;
                cur = nextnode;
            }
            return prev;
        }
    }
};

实现2:在原链表上操作

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == nullptr) {
            return head;
        }

        ListNode* prev = nullptr; // 先初始化为 nullptr
        ListNode* cur = head;

        while (cur != nullptr) {
            ListNode* front = cur->next; // 保存下一个节点
            cur->next = prev; // 反转当前节点的指向
            prev = cur; // 移动 prev
            cur = front; // 移动到下一个节点
        }
        return prev; // prev 现在是新的头节点
    }
};

需要注意的是,这里有个常见错误,下面我在写这道题的时候就已经犯了,不能在循环外先定义front,这是因为会存在一种情况只有一个结点,这时我这种写法就已经错了造成空指针问题了。

实现3:递归

这里引用一篇题解的动图来说明递归的实现过程下面是原文链接
:206. 反转链表 - 力扣(LeetCode)

这里举一个官方题解下的评论来具体来说明一下调用过程:

 第一轮出栈,head5head.next为空,返回5
 第二轮出栈,head4head.next为5,执行head.next.next=head也就是5.next=4
                      把当前节点的子节点的子节点指向当前节点
                      此时链表为
1->2->3->4<->5,由于45互相指向,所以此处要断开4.next=null
                      此时链表为1->2->3->4<-5
                      返回节点5
 第三轮出栈,head3head.next为4,执行head.next.next=head也就是4.next=3
                      此时链表为
1->2->3<->4<-5,由于34互相指向,所以此处要断开3.next=null
                      此时链表为1->2->3<-4<-5
                      返回节点5
 第四轮出栈,head2head.next为3,执行head.next.next=head也就是3.next=2
                      此时链表为
1->2<->3<-4<-5,由于23互相指向,所以此处要断开2.next=null
                      此时链表为1->2<-3<-4<-5
                      返回节点5
 第五轮出栈,head1head.next为2,执行head.next.next=head也就是2.next=1
                      此时链表为
1<->2<-3<-4<-5,由于12互相指向,所以此处要断开1.next=null
                      此时链表为1<-2<-3<-4<-5
                      返回节点5

出栈完成,最终头节点5->4->3->2->1

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

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

相关文章

手写Spring IOC-简易版

目录 项目结构entitydaoIUserDaoUserDaoImpl serviceIUserServiceUserServiceImpl ApplicationContext 配置文件初始化 IOC 容器RunApplication 注解初始化 IOC 容器BeanAutowired Reference 项目结构 entity User Data NoArgsConstructor AllArgsConstructor Accessors(chai…

面试八股(自用)

什么是java序列化&#xff0c;什么时候需要序列化? 序列化是指将java对象转化成字节流的过程&#xff0c;反序列化是指将字节流转化成java对象的过程。 当java对象需要在网络上传输 或者 持久化到存储文件中&#xff0c;就需要对java对象进行序列化处理。 JVM的主要组成部分…

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…

【Java 并发编程】阻塞队列与仿真餐厅

前言 阻塞队列 (BlockingQueue) 顾名思义是一种支持阻塞操作的队列&#xff0c;因为内部机制中添加了 wait 和 notify 方法&#xff0c;所以阻塞队列具备了线程之前相互协调的功能。阻塞队列主要运用于两个场景&#xff0c;一是生产者与消费者模型&#xff0c;二是线程池。本章…

【C语言】循环嵌套:乘法表

循环嵌套&#xff0c;外层循环执行一次&#xff0c;内层循环执行i次。分别控制 在循环的过程中加一层循环。 多层循环属于循环嵌套、嵌套循环 #include <stdio.h> #include <math.h> /* 功能&#xff1a;循环嵌套 乘法表 时间&#xff1a;2024年10月 地点&#xf…

可编辑73页PPT | 企业智慧能源管控平台建设方案

荐言分享&#xff1a;随着全球能源形势的日益紧张和智能化技术的快速发展&#xff0c;企业对于能源的高效利用和精细化管理需求愈发迫切。智慧能源管控平台作为一种集成了物联网、大数据、云计算、人工智能等先进技术的综合管理系统&#xff0c;旨在帮助企业实现能源数据的实时…

【线性回归分析】:基于实验数据的模型构建与可视化

目录 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 1. 数据准备 2. 构建线性回归模型 3. 可视化 数据分析的核心 构建预测模型 应用场景 预测模型中的挑战 结论 线性回归分析&#xff1a;基于实验数据的模型构建与可视化 在数据分析领域&#xff0c;线性…

永恒之蓝漏洞

MS17-010是微软于2017年3月发布的一个安全补丁&#xff0c;旨在修复Windows操作系统中的一个严重漏洞&#xff0c;该漏洞被称为“永恒之蓝”&#xff08;EternalBlue&#xff09;。这个漏洞影响了Windows的Server Message Block&#xff08;SMB&#xff09;协议&#xff0c;允许…

JavaEE-线程安全问题

1.多线程带来的的⻛险-线程安全 1.1 观察线性不安全 // 此处定义⼀个 int 类型的变量 private static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {// 对 count 变量进⾏⾃增 5w 次for (int i 0; i…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

Prometheus运维监控平台之监控指标注册到consul脚本开发、自定义监控项采集配置调试(三)

系列文章目录 运维监控平台搭建 运维监控平台监控标签 golang_Consul代码实现Prometheus监控目标的注册以及动态发现与配置V1版本 文章目录 系列文章目录目的一、监控指标注册到consul的golang脚本开发1、修改settings.yaml文件2、修改config/ocnsul,go文件3、修改core/consul…

视频剪辑和转换gif一体化UI页面【可以解决gif体积过大】

视频剪辑和转换gif一体化UI页面 一&#xff0c;简介 这段代码实现了一个简单的 GUI 应用程序&#xff0c;主要功能包括&#xff1a; 选择视频文件&#xff1a;用户可以通过点击“选择视频”按钮打开文件选择对话框&#xff0c;选择 MP4 格式的视频文件。 转换为 GIF&#xf…

Axure复选框全选反选取消高级交互

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;复选框全选反选取消制作 主要内容&#xff1a;点击复选框&#xff0c;实现列表数据项全选选中、反选和取消选中效果 应用场景&#xff1a;多项选定…

【完-网络安全】Windows防火墙及出入站规则

文章目录 防火墙入站和出站的区别域网络、专用网络、公用网络的区别 防火墙 防火墙默认状态一般是出站允许&#xff0c;入站阻止。 入站和出站的区别 入站就是别人来访问我们的主机&#xff0c;也就是正向shell的操作 出站就是反向shell&#xff0c;主机需要主动连接kali&am…

语音信号去噪 Matlab语音信号去噪,GUI界面。分别添加了正弦噪声和高斯噪声,分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。

Matlab语音信号去噪&#xff0c;GUI界面。分别添加了正弦噪声和高斯噪声&#xff0c;分别用了巴特沃斯低通滤波器和小波分解去噪。每步处理都可以播放出信号声音。 具体工作如下&#xff1a; 1、加载语音信号&#xff0c;显示时域频域图&#xff1b; 2、添加正弦噪声&#xff1…

数据结构代码题备考

文章目录 快速排序2011真题2013真题2018真题2016真题 快速排序的划分思想2016快速排序的最优解二路归并排序2011真题 链表备考思路基本功练习 图图的数据定义-邻接矩阵图的数据定义-邻接表2021-邻接矩阵2023-邻接矩阵2021-邻接表2023-邻接表 二叉树常用思路基本功练习前中后序遍…

思想实验思维浅谈

思想实验思维浅谈 思想实验&#xff08;Thought Experiment&#xff09;是一种在思想中进行的假想实验&#xff0c;思想实验激发人的想象力和思辨能力&#xff0c;是科学家思考问题的重要工具&#xff0c;通过想象、推理和分析来探索某种理论、假设或概念的可能性和内在逻辑&am…

项目管理软件真的能让敏捷开发变得更简单吗?

敏捷开发是一种以快速交付和适应变化为核心特点的软件开发方法。其特点包括尽早并持续交付、能够驾驭需求变化、版本周期内尽量不加任务、业务与开发协同工作、以人为核心、团队配置敏捷等。 例如&#xff0c;尽早并持续交付可使用的软件&#xff0c;使客户能够更早地体验产品…

涉密网和非涉密网之间企业如何进行安全跨网文件交换?

在数字化时代&#xff0c;企业面临着跨网文件交换的挑战&#xff0c;尤其是涉密网和非涉密网之间的数据传输。这种交换不仅要求高效&#xff0c;更要求安全&#xff0c;以防止数据泄露和网络攻击。以下是一些关键点&#xff0c;帮助企业实现安全跨网文件交换。 应用场景和重要性…

Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)

文章目录 网络连接相关命令pingtelnetcurlwget 网络连接相关命令 ping ping 命令是用于测试网络连接和诊断网络问题的工具。它通过向目标主机发送 ICMP&#xff08;Internet Control Message Protocol&#xff09;回显请求&#xff0c;并等待回复&#xff0c;以确定目标主机是…