LeetCode 算法:反转链表 c++

embedded/2024/10/18 5:41:08/

原题链接🔗:反转链表
难度:简单⭐️

题目

给你单链表的头节点 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. 题解

有两种常见的方法来解决这个问题:迭代和递归。

  • 迭代方法
    • 初始化三个指针:prev 初始化为 nullptr(因为反转后的链表第一个节点的 next 应该是nullptr),current 初始化为头节点 head,next 用于临时存储下一个节点。
    • 遍历链表:使用一个循环,当 current 不为 nullptr 时,执行以下操作:
      • 保存 current 的下一个节点到 next。
      • 将 current 的 next 指向 prev,实现反转。
      • 更新 prev 和 current 为下一个节点:prev = current,current = next。
    • 当循环结束时,prev 将指向反转后的头节点,返回 prev。
  • 递归方法
    • 基本情况:如果 head 是 nullptr 或者 head->next 是 nullptr,说明链表为空或只有一个节点,直接返回 head。
    • 递归反转:递归调用 reverseList 函数,传入 head->next 作为参数,获取反转后的链表的头节点。
    • 重新链接节点:将当前节点 head 的下一个节点的 next 指向 head,实现反转。
    • 设置当前节点的 next 为 nullptr:防止链表形成环。
    • 返回新的头节点:递归调用返回的头节点。
  1. 复杂度:时间复杂度O(n),空间复杂度O(1)。
  2. 过程:迭代法如下代码。
  3. c++ demo
#include <iostream>// 定义链表节点
struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 解决方案类
class Solution {
public:// 迭代方法反转链表ListNode* reverseList(ListNode* head) {ListNode* prev = nullptr;ListNode* current = head;ListNode* next = nullptr;while (current != nullptr) {next = current->next; // 保存下一个节点current->next = prev; // 反转当前节点的指针prev = current;       // 移动prev到当前节点current = next;       // 移动current到下一个节点}return prev; // 返回新的头节点}
};// 主函数,用于演示
int main() {Solution solution;// 创建一个示例链表: 1 -> 2 -> 3 -> 4 -> 5ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);head->next->next->next->next = new ListNode(5);// 打印原始链表std::cout << "Original List: ";ListNode* current = head;while (current != nullptr) {std::cout << current->val << " -> ";current = current->next;}std::cout << "nullptr" << std::endl;// 反转链表ListNode* reversedHead = solution.reverseList(head);// 打印反转后的链表std::cout << "Reversed List: ";current = reversedHead;while (current != nullptr) {std::cout << current->val << " -> ";current = current->next;}std::cout << "nullptr" << std::endl;// 释放链表内存while (reversedHead != nullptr) {ListNode* tmp = reversedHead;reversedHead = reversedHead->next;delete tmp;}return 0;
}
  • 输出结果:

Original List: 1 -> 2 -> 3 -> 4 -> 5 -> nullptr
Reversed List: 5 -> 4 -> 3 -> 2 -> 1 -> nullptr
在这里插入图片描述


http://www.ppmy.cn/embedded/48865.html

相关文章

Requests —— 请求头设置!

前戏 在我们进行自动化测试的时候&#xff0c;很多网站都会都请求头做个校验&#xff0c;比如验证 User-Agent&#xff0c;看是不是浏览器发送的请求&#xff0c;如果我们不加请求头&#xff0c;使用脚本访问&#xff0c;默认User-Agent是python&#xff0c;这样服务器如果进行…

Github 2024-06-13开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3非开发语言项目2Shell项目1TypeScript项目1Swift项目1PHP项目1Blade项目1JavaScript项目1从零开始构建你喜爱的技术 创建周期:2156…

Go-知识并发控制RWMutex

Go-知识并发控制RWMutex 1. 介绍2. 原理2.1 读写锁的数据结构2.2 接口定义2.3 Lock() 写锁定 原理2.4 Unlock() 写锁定解锁 原理2.5 RLock() 读锁定 原理2.6 RUnlock() 读锁定解锁 原理 3. 场景分析3.1 写锁定如何阻塞写锁定3.2 写锁定如何阻塞读锁定3.3 读锁定如何阻塞写锁定3…

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日&#xff0c;苹果WWDC 2024全球开发者大会如约而至&#xff0c;带来了众多令人兴奋的新功能和新产品。其中&#xff0c;AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS&#xff0c;再到 Siri 和开发者工具&#xff0c;苹果正在将 AI 融入到其生…

ubuntu 22.04下利用webmin 搭建一个Wordpress 网站(2)

上次我们讲到第二部分&#xff0c;今天我们继续这一个话题 第三部分&#xff1a;利用webmin创建一个wordpress网站 1、在 Webmin 内安裝Apache 未使用的模块> Apache Webserver > 现在安装 会出现如下图所示的有关软件 刷新模快后 检查开机时要自动启动Apache 测…

【线性代数】向量空间,子空间,向量空间的基和维数

向量空间 设V为n维向量的集合&#xff0c;如果V非空&#xff0c;且集合V对于向量的加法以及数乘两种运算封闭&#xff0c;那么就称集合V为向量空间 x&#xff0c;y是n维列向量。 x 向量组等价说明可以互相线性表示 向量组等价则生成的向量空间是一样的 子空间 例题18是三位向…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…