优雅反转链表:LeetCode 206题深度解析与艺术实现

优雅反转链表:LeetCode 206题深度解析与艺术实现

🌟 优雅反转链表:LeetCode 206题深度解析与艺术实现 🌟

视频地址

因为想更好的为大佬服务,制作了同步视频,这是Bilibili的视频地址

链表操作是算法学习中的基础必修课,而反转链表更是其中最经典的练习题之一。今天,我们将以LeetCode 206题为例,深入探讨如何优雅地实现单链表的反转操作,并分析其中的精妙之处。

🎨 链表反转的艺术

链表反转,看似简单,实则蕴含着指针操作的精髓。就像一位舞者优雅地转身,链表中的节点也需要流畅地改变它们的指向关系。让我们先来欣赏一下这个"舞蹈"的基本步骤。

🧠 算法思路图解

原始链表

1 --> 2 --> 3 --> 4 --> 5 --> NULL

反转过程

NULL <-- 1 2 --> 3 --> 4 --> 5

NULL <-- 1 <-- 2 3 --> 4 --> 5

NULL <-- 1 <-- 2 <-- 3 4 --> 5

NULL <-- 1 <-- 2 <-- 3 <-- 4 5

NULL <-- 1 <-- 2 <-- 3 <-- 4 <-- 5

图表说明:展示了链表从原始状态逐步被反转的全过程,每一步都清晰地显示了已反转部分和未反转部分的分界

🔍 核心思想三指针法

反转链表的核心在于三指针技巧,这就像三位默契的舞伴,各司其职又相互配合:

  1. Pre指针:始终指向已反转部分的头节点,初始为NULL
  2. Current指针:指向待反转部分的头节点,初始为原链表头
  3. Next指针:临时保存current的下一个节点,防止链表断裂

💻 代码实现详解

下面让我们用C++来实现这一优雅的算法:

/** * 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) {} * }; */classSolution{public: ListNode*reverseList(ListNode* head){// 边界条件处理:空链表或单节点链表直接返回if(head ==nullptr|| head->next ==nullptr){return head;} ListNode* pre =nullptr;// 已反转部分的头节点 ListNode* current = head;// 待反转部分的头节点 ListNode* p =nullptr;// 临时指针while(current !=nullptr){ p = current->next;// 保存下一个节点 current->next = pre;// 反转当前节点 pre = current;// pre前移 current = p;// current前移}return pre;// 最终pre就是新链表的头节点}};

📝 代码关键点解析

  1. 边界处理:首先检查链表是否为空或只有一个节点,这些情况无需反转
  2. 指针初始化:三个指针各就各位,准备开始"舞蹈"
  3. 循环反转:每一步都精心安排三个指针的移动,确保链表不会断裂
  4. 返回值:最终pre指针指向的就是反转后的新链表头

🏆 性能分析

让我们用表格来清晰展示算法的性能表现:

指标数值/描述说明
时间复杂度O(n)只需遍历链表一次
空间复杂度O(1)只使用了固定数量的指针变量
稳定性稳定不改变相同值节点的相对顺序
适用性单链表不适用于双向链表等复杂结构

🌈 变式与扩展

掌握了基础的反转方法后,我们可以挑战一些有趣的变式问题:

  1. 反转链表的一部分(LeetCode 92题)
  2. K个一组反转链表(LeetCode 25题)
  3. 回文链表判断(LeetCode 234题)

💡 总结与思考

链表反转看似简单,却蕴含着指针操作的深刻原理。通过三指针的优雅舞蹈,我们实现了链表的完美转身。记住:

  • 始终明确每个指针的职责
  • 注意保存下一个节点的引用,防止链表断裂
  • 边界条件的处理同样重要

希望这篇解析能帮助你真正理解链表反转的精髓,在算法学习的道路上更进一步!

优雅反转链表:LeetCode 206题深度解析与艺术实现
“算法就像诗歌,简洁中蕴含着无限智慧。” —— 无名程序员

Read more

Ubuntu 24.04 LTS WSL 下载地址

地址可能会变,但是进入官网后,就按照链接的文件夹目录,一个一个找就可以找到的(亲测:清华大学镜像地址是可以的) https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ 一、Ubuntu 官方 WSL 稳定版(.wsl,双击/导入都稳) * Ubuntu 24.04.2 LTS WSL 官方稳定版(x64) https://releases.ubuntu.com/noble/ubuntu-24.04.2-wsl-amd64.wsl 二、国内清华镜像(下载最快、最稳) * 清华镜像 Ubuntu 24.04.2 WSL 稳定版(

By Ne0inhk
ARM Linux 驱动开发篇--- Linux 并发与竞争实验(自旋锁实现 LED 设备互斥访问)--- Ubuntu20.04自旋锁实验

ARM Linux 驱动开发篇--- Linux 并发与竞争实验(自旋锁实现 LED 设备互斥访问)--- Ubuntu20.04自旋锁实验

🎬 渡水无言:个人主页渡水无言 ❄专栏传送门: 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》 ❄专栏传送门: 《freertos专栏》《STM32 HAL库专栏》 ⭐️流水不争先,争的是滔滔不绝  📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生 | 省级优秀毕业生获得者 | ZEEKLOG新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生 在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连 目录 前言 一、实验基础说明 1.1、自旋锁简介 1.2 本次实验设计思路 二、硬件原理分析(看过之前博客的可以忽略) 三、实验程序编写 3.1 自旋锁 LED 驱动代码(spinlock.c) 3.2、驱动代码分段解析 3.2.

By Ne0inhk
磁盘到 inode:深入理解 Linux ext 文件系统底层原理

磁盘到 inode:深入理解 Linux ext 文件系统底层原理

前言: 文件系统是操作系统管理存储的核心机制,却常常被开发者视为“黑盒”。本文将从磁盘硬件原理出发,深入浅出地剖析 Linux 中经典的ext 文件系统如何组织数据、管理文件,并揭示inode、块、软硬链接等关键概念的底层实现。通过理解这些机制,你不仅能更高效地使用文件系统,还能在调试、优化乃至数据恢复时多一份底气。让我们一起揭开文件系统的神秘面纱! 文章目录 * 一、硬件理解 * 1.1 磁盘物理结构 * 1.2 磁盘的逻辑结构 * 二、Ext文件系统 * 2.1 文件属性与分区 * 2.2 组管理字段 * 2.3 inode编号查询文件 * 2.4 路径缓存(目录树) * 2.5 inode与Data Blocks的映射 * 2.6 文件结构图解 * 三、

By Ne0inhk
【Linux网络系列】:打破 HTTP 明文诅咒,在Linux 下用 C++ 手搓 HTTPS 服务器全过程!(附实现源码)

【Linux网络系列】:打破 HTTP 明文诅咒,在Linux 下用 C++ 手搓 HTTPS 服务器全过程!(附实现源码)

🔥 本文专栏:Linux网络 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录:成人的世界里,情绪是最廉价的成本。你可以崩溃,但请记得设置闹钟。哭完之后,账单还在,生活还得继续,最能治愈焦虑的永远不是鸡汤,而是账户里的余额和手里的专业技能。 ★★★ 本文前置知识: Http 引入 在之前的讲解中,我们探讨了HTTP 协议并实现了一个基于HTTP 的 Web 服务器。然而,HTTP存在一个根本性的安全缺陷,即明文传输。我们知道,在客户端(通常为浏览器)与服务端通信的大多数场景中,客户端会向服务端发送GET 或POST 请求。这两种请求均可用于提交数据。对于GET 请求,其提交的表单数据以查询参数的形式附加在请求行中的 URL 之后,表现为键值对。由于 URL 本身存在长度限制,GET 请求只能传递较简单的表单数据,无法传输体积较大的内容(例如文件)。此外,提交后,浏览器地址栏会完整显示

By Ne0inhk