算法:leetcode_206_反转链表

【忍者算法】从生活场景理解链表反转:最重要的基础算法|LeetCode 206 反转链表 反转链表看似简单,却是链表操作的基石。就像建房子要先打好地基,做复杂的链表操作前必须深刻理解反转原理。无数高频面试题都建立在这个基础之上:K个一组反转链表、判断回文链表、链表重排序等等。真正理解了反转链表,这些题目就会迎刃而解。 阅读详情

目录

0. 引言

1. 题目介绍

2. 思路

2.1 更清晰的示例

2.2 确定变量

2.2.1 前驱节点pre

2.2.2 后继节点next

2.3 往后迭代循环移动

2.4 循环结束, 返回结果

3. 打印示例

4. 代码

Java

C++

JS

5. 一键三连么么哒


0. 引言

abandon!abandon!

这道题和1. 两数之和 并称为算法届的"abandon"!。

今天水水内容, 就从梦开始的地方出发吧。

反转链表做了之后, 可以尝试做92. 反转链表 II , 也是懒猪博主下一篇更新内容。

此题如此简单, 那我的任务就是让每一个看了的人都能完全看懂,并且铭记于心,因为很多人总是尝试想学好算法, 就从反转链表和两数之和做起, 但是三天打鱼两天晒网, 忙其他事情去了, 过段时间又想学算法, 又从abandon开始, 不如一步到胃, 就再仔细看这一次吧!

1. 题目介绍

2. 思路

2.1 更清晰的示例

题目看似是1->2->3->4->5, 其实最后一个节点5还会往后面指向null的, 这也是判断它是否为链尾节点的依据。

同样地, 反转后的也是。由于是在原链表上面直接操作, 因此我们直接这样看吧:

2.2 确定变量

2.2.1 前驱节点pre

首先, 我们发现, 节点1最终是要当链尾节点的, 因此它会指向null, 而且是它率先做出改变, 第一步就操作节点1,因此可以考虑迭代式地从左往右进行操作。

要将一个节点, 比如2指向它的前一个节点1, 那么肯定要记录它的前一个节点吧, 因此会有变量pre记录其前驱节点。

节点1要指向null, 那么前驱节点会初始化为null:

        ListNode pre = null;

2.2.2 后继节点next

对于一个单向链表, 某个节点想要链接上另一个节点, 靠的是.next = 另一个节点来更新。

对于节点1, 如果先要将它指向pre, 那么它的next就给了pre, 它跟节点2就分手了, 没有联系了。

那么它怎么回来呢?那我问你, 玩过阿卡丽吗?

阿卡丽的E技能是:

如图所示, 现在这里有4个节点, 你作为阿卡丽[2]想要拿人头[3]并安全返回烟幕[1]里面, 请先往你原来的地方[1]放回旋镖。

意思就是, 当节点1要把它的next指向前驱节点pre之前, 请先记录好它要回去的地方, 记录好它原先的next指向的节点2。

// 先记录节点的原先的后面一个节点            
ListNode next = cur.next;
// 然后再将next指针指向左边的前驱节点
cur.next = pre;

2.3 往后迭代循环移动

此时, pre取代cur的位置, 现在节点1作为pre了,

而节点2作为当前要操作的节点cur, 它变成了阿卡丽!

pre = cur;
cur = next;

接着将会继续循环, 判断条件是 当前的节点cur不能为空。

记得在最开始cur初始化为head, 你问为什么head不直接作为cur, 你见过领导干活吗, head是你的头头, 它不可替代。而你作为牛马cur, 你一直在变化, 用完了也没人管你, 直接扔掉。

    // 找个外包cur来干活, 领导head去睡觉
    ListNode cur = head;
    // 要遍历的当前节点cur不为空 则继续
    while (cur != null) {
    ListNode next = cur.next;
    // 5. 将cur的next指针指向前驱节点, 实现一次反转
    cur.next = pre;
    // 6. 反转后, pre向右移动, 取代cur的位置
    pre = cur;
    // 7. 由于第4步已经提前记录好了next节点, 赋值给cur即可, 实现cur的向右移动
    cur = next;
}

2.4 循环结束, 返回结果

此时外包小子cur为空了, 循环结束, 很明显现在前驱节点pre成为这个链表的头节点, 直接返回。

return pre;

3. 打印示例

你是否为构造链表或者树对象感到麻烦, 

你是否想清晰看懂对象结构,

请看我的另一篇分享博客:打印节点(链表或者二叉树)工具-优快云博客

public static void main(String[] args) {
        // 获取打印工具对象, 第二个参数为0代表是链表
        PrintUtils utils = new PrintUtils(new int[]{1, 2, 3, 4, 5}, 0);
        // 打印出来链表
        utils.print();
        // 获取链表结构, 作为本题形参
        ListNode head = reverseList(utils.getListNode());
        // 使用打印工具打印出链表结构
        PrintUtils.printListNode(head);
    }

请看控制台:

4. 代码

Java

public static ListNode reverseList(ListNode head) {
        // 1. 由于要反转, 第一个节点的前面要为空, 那么就初始化前驱节点pre为空
        ListNode pre = null;
        // 2. cur来作为遍历节点, 初始化为头节点
        // 找个外包cur来干活, 领导head去睡觉
        ListNode cur = head;
        // 3. 要遍历的当前节点cur不为空 则继续
        while (cur != null) {
            // 4. 由于要变换节点, 先提前记录好当前节点cur的下一个节点next
            ListNode next = cur.next;
            // 5. 将cur的next指针指向前驱节点, 实现一次反转
            cur.next = pre;
            // 6. 反转后, pre向右移动, 取代cur的位置
            pre = cur;
            // 7. 由于第4步已经提前记录好了next节点, 赋值给cur即可, 实现cur的向右移动
            cur = next;
        }
        // 8. 当前遍历的节点为空, 那么这个链表的最后一个节点则是反转后的第一个节点, cur为空, 前驱节点pre现在就是老大, return!
        return pre;
    }


    public static void main(String[] args) {
        // 获取打印工具对象, 第二个参数为0代表是链表
        PrintUtils utils = new PrintUtils(new int[]{1, 2, 3, 4, 5}, 0);
        // 打印出来链表
        utils.print();
        // 获取链表结构, 作为本题形参
        ListNode head = reverseList(utils.getListNode());
        // 使用打印工具打印出链表结构
        PrintUtils.printListNode(head);
    }

C++

ListNode* reverseList(ListNode* head) {
    // 1. 由于要反转, 第一个节点的前面要为空, 那么就初始化前驱节点pre为空
    ListNode* pre = nullptr;
    // 2. cur来作为遍历节点, 初始化为头节点
    // 找个外包cur来干活, 领导head去睡觉
    ListNode* cur = head;
    // 3. 要遍历的当前节点cur不为空 则继续
    while (cur != nullptr) {
        // 4. 由于要变换节点, 先提前记录好当前节点cur的下一个节点next
        ListNode* next = cur->next;
        // 5. 将cur的next指针指向前驱节点, 实现一次反转
        cur->next = pre;
        // 6. 反转后, pre向右移动, 取代cur的位置
        pre = cur;
        // 7. 由于第4步已经提前记录好了next节点, 赋值给cur即可, 实现cur的向右移动
        cur = next;
    }
    // 8. 当前遍历的节点为空, 那么这个链表的最后一个节点则是反转后的第一个节点, cur为空, 前驱节点pre现在就是老大, return!
    return pre;
}

JS

function reverseList(head) {
    // 1. 由于要反转, 第一个节点的前面要为空, 那么就初始化前驱节点pre为空
    let pre = null;
    // 2. cur来作为遍历节点, 初始化为头节点
    // 找个外包cur来干活, 领导head去睡觉
    let cur = head;
    // 3. 要遍历的当前节点cur不为空 则继续
    while (cur != null) {
        // 4. 由于要变换节点, 先提前记录好当前节点cur的下一个节点next
        let next = cur.next;
        // 5. 将cur的next指针指向前驱节点, 实现一次反转
        cur.next = pre;
        // 6. 反转后, pre向右移动, 取代cur的位置
        pre = cur;
        // 7. 由于第4步已经提前记录好了next节点, 赋值给cur即可, 实现cur的向右移动
        cur = next;
    }
    // 8. 当前遍历的节点为空, 那么这个链表的最后一个节点则是反转后的第一个节点, cur为空, 前驱节点pre现在就是老大, return!
    return pre;
}

5. 一键三连么么哒

宝宝们觉得我的分享笔记有用的话, 点赞关注收藏么么哒!

我的分享笔记都会采取有趣的方式分享,印象深才会记得住。

更新预告:92. 反转链表 II - 力扣(LeetCode)

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

cadence allegro 17.x 降版本到16.6的转换工具

Cadence17.x版本降低到16.6版本转换工具 下载链接:Cadence17.x版本降低到16.6版本转换工具   使用方法: 软件使用比较简单,在「第一个路径输入栏」浏览指向17.x的设计文件,也就是需要降版本的17.4或者17.2的文件,然后在「第二个路径输入栏」里浏览指向转换后的文件保存路径,然后点击「转换」按钮即可。 ...

ltqdxl的博客 1万+

【简单】力扣算法题解析LeetCode206:反转链表

本文介绍了反转单链表的两种方法:迭代法和递归法。迭代法通过维护三个指针逐个反转节点指向,时间复杂度O(n),空间复杂度O(1)。递归法通过递归到链表末端后反转节点,时间复杂度O(n),空间复杂度O(n)。两种方法均提供Java代码实现,并分析了核心思想和复杂度。

ylumwd的博客 404

Foxglove 介绍以及入门使用教程

Foxglove 是由Foxglove 工作室开发的一套工具集,包括和等组件。跨平台支持:可以在 Windows、macOS 和 Linux 上运行。多协议兼容:支持 ROS、ROS 2、CAN 数据以及其他自定义协议。丰富的可视化功能:可以绘制点云、轨迹、激光雷达数据、IMU 数据等。实时与离线模式:既可以实时监控机器人状态,也可以加载和回放记录的数据文件。Foxglove 的 3D 视图允许你以三维方式查看机器人的运动轨迹、传感器数据和其他几何信息。你可以旋转、缩放和平移视图以获得更好的观察角度。

zolty 1万+

LeetCode 206 号算法题 :反转单链表

1. 迭代解法 leetcode 206 号算法题:反转单链表【数据结构与算法】 代码如下: public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = c.

spark_tang的博客 600

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5561

【算法】笔记:LeetCode 206. 反转链表

这道题可以拆成几个小点去理解,本篇博文快速记录一下。有迭代和递归两种解法。迭代的解法空间复杂度更优秀,递归的思想更巧妙。这里主要总结下迭代的解法。并简要理解下递归的解法。LeetCode 206. 反转链表。

chenghan_yang的博客 736

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型

本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。

weixin_30387423的博客 167

LeetCode初级算法之链表:206 反转链表

...

木瓜煲鸡脚的博客 209

【数据集】中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

中国大气污染物数据集CHAP(1km空间分辨率)-韦晶团队

WW、forever的博客 2590

AD-Copilot 论文解读:把“大模型看图”升级为“对照检验”的工业异常检测助手

本文提出AD-Copilot,一个面向工业异常检测的视觉语言助手,通过视觉上下文比较解决现有方法的不足。针对工业场景中多模态大模型表现不佳的问题,作者指出核心原因在于缺乏工业数据和比较能力不足。为此,论文提出三个关键贡献:构建Chat-AD数据集,设计Comparison Encoder显式建模图像差异,以及采用多阶段训练策略。实验表明,该方法在MMAD基准上达到82.29%准确率,定位任务提升3.35倍,并展现出良好的泛化能力。消融实验验证了比较模块的有效性,表明其成功源于高质量比较数据与显式比较模块的协

blanokvaffy的博客 330

【忍者算法】从生活场景理解链表反转:最重要的基础算法|LeetCode第206题 反转链表

LeetCode第206题"反转链表"要求:给你单链表的头节点 head,请你反转链表,并返回反转后的链表。就像你要完成一个大项目,不用考虑下属如何完成他们的任务,你只需要考虑如何把大家的工作整合起来。// curr是"教练",去帮助下一个学生。// prev是"助教",扶着已完成转身的学生。// prev指向最后一个处理的节点,即新的头节点。// 断开2原来的指向,防止形成环。// 假设后面的链表已经反转完成,newHead指向反转后的头节点。// 假设当前是节点2,head.next是节点3。

weixin_55010563的博客 339

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1946

力扣算法:203、移除链表元素 707、设计链表 206、反转链表

力扣算法:203、移除链表元素 707、设计链表 206、反转链表

m0_51982291的博客 1252

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

每天一道算法题(JavaScript篇):反转链表 力扣206

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

阿花的博客 714

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LeetCode算法题206:反转链表解析

反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 这个题看起来简单,但是想起来还是得一些小技巧,可能最近脑子不太灵光,这个题竟然想了很久。。。。首先肯定是要用两种方法的,递归法要注意的就是一方面最后返...

Alex的博客 463

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

链表反转算法详解:从LeetCode 206到工程实践

链表是数据结构中的基础概念,通过指针连接实现动态存储。反转操作通过改变节点指向关系,将线性结构逆向重组,在内存优化和算法效率方面具有重要价值。该技术广泛应用于撤销操作、数据同步等场景,也是技术面试的高频考点。以LeetCode 206题为例,迭代法和递归法分别体现了空间与时间复杂度的权衡,其中指针操作和边界条件处理是关键难点。掌握链表反转不仅能提升算法能力,也为处理播放列表逆序等实际问题提供解决方案。

weixin_42116058的博客 230

算法第3天|链表理论基础、删除链表节点:LeetCode203、设计链表:LeetCode707 、反转链表:LeetCode206

链表是一种数据结构,通过一系列的“节点”连接在一起,每个节点存储两个信息:①数据:当前节点存储的值②指针:指向下一个节点的位置通过这些节点的指针,链表像“链条”一样把数据连接起来。

m0_47408374的博客 909

算法第十三天:leetcode206.反转链表

的链接如下表所示,您可直接复制下面网址进入力扣学习,在观看下面的内容之前一定要先做一遍哦,这样才能印象深刻!链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?,请你反转链表,并返回反转后的链表。

m0_75068978的博客 475

【算法笔记】不用库函数手撕力扣之力扣206:反转链表

题目链接 题解 方法1:递归 主要思路 这个方法的主要思路就是一直递归到尾部,然后从尾部往前逐一反转(之所以没有正向反转是因为反转后会导致经过反转的部分和没有反转的部分之间没有指针连接) 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct Li

weixin_40918019的博客 375

JavaScript算法09-反转链表(leetCode:206)

反转链表 一、题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1] 提示: 链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000 进阶: 链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题? 二、思路 迭代 假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。 在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由

Y_soybean_milk的博客 440

【忍者算法】从生活场景理解链表反转:最重要的基础算法|LeetCode第206题 反转链表...

从生活场景理解链表反转:最重要的基础算法 为什么这道题如此重要 反转链表看似简单,却是链表操作的基石。就像建房子要先打好地基,做复杂的链表操作前必须深刻理解反转原理。无数高频面试题都建立在这个基础之上:K个一组反转链表、判断回文链表、链表重排序等等。真正理解了反转链表,这些题目就会迎刃而解。 问题描述 LeetCode第206题"反转链表"要求:给你单链表的头节点 head,请你反转链表,并返回...

weixin_40573056的博客 84

【算法刷题day3】Leetcode: 203.移除链表元素、707.设计链表、 206.反转链表

没试过不适用虚拟头节点/*** int val;* }*/= null){else出现了奇怪的bug,全部删掉重新写一遍,没有bug了。暂无203.移除链表元素2.5 练习时长两年半707.设计链表206. 反转链表。

qq_45022758的博客 1138

[从零开始面试算法] (04/100) LeetCode 206. 反转链表:迭代与递归的双重奏

当前珍珠” curr 已经成功穿到了新绳子上,所以它现在变成了新绳子的头,prev 需要更新为 curr 的位置。它的核心思想是:从头到尾遍历原始链表,在遍历的过程中,逐个地将每个节点的 next 指针“反向”。当 head 为空,或者 head->next 为空(即链表为空或只有一个节点)时,反转它本身就是它自己,直接返回 head 即可。“新绳子” prev 为空,“当前珍珠” curr 为原始链表的头。将当前珍珠的 next 指针,从指向原始的下一个节点,改为指向“新绳子”的头部。

2201_75993451的博客 951

【leetcode】206.反转链表

本文介绍了反转链表的两种解法:迭代法和递归法。迭代法使用双指针(pre和cur),通过临时存储节点实现指针方向反转,最终返回pre作为新链表头。递归法则通过层层深入找到尾节点,回溯时逐层修改指针指向。两种方法都推荐配合图示手工模拟来加深理解。代码实现简洁高效,时间复杂度均为O(n)。

2402_83244812的博客 405
上一篇: 算法:leetcode_113_路径总和Ⅱ
下一篇: 算法:leetcode_92_反转链表Ⅱ
bugMaker_Rehse
博客等级 码龄1年 133粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值