链表反转

单链表反转两种方法 最近同学介绍了一个lettcode(力扣)OJ给我,个人认为这个网站比母校的oj,杭电oj界面友好很多,题库充足,且支持多种主流语言,很适合闲时刷刷提高算法能力,算法的练习如同内功的修炼,碰到算法问题,经常有一种无力感,只能慢慢总结了。 链表是一种重要的数据结构,因为有递归性质,所以总是难以理解,涉及链表的复杂操作总是感觉一头雾水,看别人的实现代码总是似懂非懂,看完就忘,实际上就是没有理解透彻,特... 阅读详情

一、要求

给定一个链表,要求把链表反转,假如原链表存储的值依次为 1->2->3->4->null;,
则要求输出结构为4 -> 3 -> 2 -> 1 -> null

二、分析

该链表的实现主要是要改变链表的指向。因此我们可以把问题分解成小模块,先不要想着如何把整个链表反转,而是先实现把两个结点反转,然后再依次循环实现整个链表的反转。这种把大问题化为小问题的思想正是递归思想,一般可以用递归实现的也就可以用迭代实现。接下来看一下如何用递归和迭代实现链表的反转?

三、代码实现

3.1递归实现
3.1.1思路
  1. 递归就是方法不断调用自身,直到条件结束。
  2. 这里结束条件是最后一个结点的链域等于NULL;
3.1.2代码
public LinkNode reversal(LinkNode head) {
        if (head == null || head.getNext() == null) {
            return head;
        }

        LinkNode next = head.getNext();
        LinkNode node = reversal(next); //不断的调用方法本身
        next.setNext(head);
        head.setNext(null);

        return  node;
    }

想要把递归这块的内部过程了解,我们需要借助堆栈的入栈和出栈来跟踪代码;
调用方法本身是在入栈,方法的返回是在出栈。

假设给定一个链表:
在这里插入图片描述
做入栈操作:入栈时用到的变量有head, next两个变量,我们来看看在入栈过程中两个变量的值变化
在插入图片描述
刚开始传递的时整个链表head,只要链表还有结点,就让next指向下一个结点再把该结点作为参数传进去,直到为最后一个结点时,返回,这是就到了出栈的过程:
做出栈操作:出栈时用到的变量有head, next,node三个变量,我们来看看在出栈过程中三个变量的值变化
在这里插入图片描述
刚开始栈顶弹出的是链表的最后一个结点,每次出栈都让后一个结点指向前一个结点,再把前一个结点的链域设置为NULL,当全部出栈,把保存了最后结果的node值返回。

总结:使用递归虽然代码简洁,但是不好理解,而且递归调用方法,浪费空间,而且如果链表太长还容易造成堆栈的溢出。
3.2迭代实现
3.2.1思路
  1. 利用变量的原值推算出变量的一个新值,迭代就是A不停的调用B。
  2. 这里我们需要定义三个变量:
  3. 一个表示当前节点,该节点可以用来当作循环条件;
  4. 一个表示直接前驱节点,初始化为null,就可以巧妙的把反转后的链表的最后一个结点的链域设置成null;因为是从链表的第一个结点开始遍历链表,所以第一个结点也就是反转后的最后一个结点,如果刚开始不给它的链域设置null,后面就没有机会了;
  5. 一个表示直接后继结点,当前面的改变指向后,这个变量可以用来保存剩余结点;
  6. 最后用遍历来不断改变这三个变量的值;就可实现反转;
3.2.2代码
public LinkNode reversal(LinkNode node) {
        LinkNode pro = null; //直接前驱节点
        LinkNode curr = node; //当前结点
        LinkNode next = null; //直接后继节点
        while(curr != null) {
            next = curr.getNext();
            curr.setNext(pro);
            pro = curr;
            curr = next;
        }
        return pro;
    }

先把代码思路过一遍:
在这里插入图片描述

  1. 刚开始传进来一个node链表,先让curr指向该链表;
  2. 然后开始遍历,让next指向下一个结点,curr指向pro,因为pro初始化为null,所以这时候就把第一个结点的链域设置成null了;
  3. 然后让pro指向当前结点curr,curr指向next;
  4. next再后移一个结点;
总结:这里一定要注意顺序,顺序不对会导致值被覆盖,不能达到目的。

优点:使用迭代效率高,运行时间只因循环次数增加而增加;而且没什么额外开销,空间上也没有什么增加

缺点: 不容易理解;代码不如递归简洁; 编写复杂问题时困难。

反转链表 参考:公众号labuladong 文章目录反转整个链表 - 递归反转链表前 N 个节点 - 递归反转链表的⼀部分 - 递归K 个⼀组反转链表反转整个链表 - 迭代反转 a 到 b 之间的结点 - 迭代K 个⼀组反转链表注 反转整个链表 - 递归 对于递归算法,最重要的就是明确递归函数的定义。 reverse 函数定义:输⼊⼀个节点 head ,将「以 head 为起点」的链表... 阅读详情

相关推荐

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

数据算法之反转链表(五种方法)

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]这道题来自力扣的第206题,今天我们尝试使用五种不同的方法来实现链表的反转。

weixin_63834061的博客 6872

合宙Air780EP速连OneNET:AT+MQTT应用指南

本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。

2401_82812461的博客 1390

反转链表的四种方式

此时我们如果把end继续向后移动,我们就会发现end指向了NULL,所以我们也找到了循环终止的条件(end==NULL)。迭代法我们需要用三个指针完成,分别是前驱节点(pre),当前节点(cur),后驱节点(next)。当我们最后一次执行q=p->next(NULL)时跳出循环,反转结束。递归法其实理解起来还是有点难度的,主要需要我们明白递和归分别实现了什么。我们只需要用头插法的方式把原链表的数据一一插入,就能达到反转的效果。我们需要创建指针进行移动指向原链表的数据。原地反转需要用两个指针进行移动去完成。

2301_79977698的博客 8515

Windows Server 2019整机备份与异机还原实战:从虚拟机到物理机的完整迁移指南

本文详细介绍了Windows Server 2019整机备份与异机还原的实战操作,涵盖从虚拟机到物理机的完整迁移流程。通过环境准备、备份策略设计、具体操作步骤及迁移后优化等内容,帮助用户实现系统环境的无缝迁移,特别适用于服务器硬件升级、数据中心迁移等场景。

weixin_30555125的博客 135

嵌入式:简单的service框架

在嵌入式中,我们获取一个资源、设置一个变量、更新数据的话最直接的方式就是直接调用一个函数。这样的写法也可以满足基本的功能,前提是这个系统是只要一个任务,只有一个while(1)如图1.1。图1.1当有两个或者两个以上的任务的时候,同时调用一个函数(设置一个状态值、操作同一个资源、操作指针等行为)的流程如图1.2。图1.2当两个任务同时操作一个资源的时候,就会有重入的问题,会导致想不到的异常问题(数据不对、指针异常等)。

stupid的博客 987

反转链表的四种方法

分享了原地反转,头插,迭代,递归四种反转链表的方法。

z3551906947的博客 1万+

<PLC><工控>汇川Easy521PLC与压力传感器485通讯实例

有些PLC在进行串口通讯时,配置完串口参数后,还需要自己编程序来读写,但本例中汇川Easy521配置完成后,想要读取从站什么数据,只需要在“COM0 Modbus配置窗口”配置即可。可以同时配置多个从站。在配置窗口的右侧点击新增按钮,就会自动生成一条从站的配置,默认从站站号为“1”,触发方式是“循环”,功能码是03(读寄存器),从站寄存器地址为0,长度为“1”,映射地址需要自己添加。因为我们是将PLC设置为Modbus主站,所以压力传感器就是从站,我们的需求时PLC从这些从站传感器中读取数据,比如压力值。

用沸腾的热血,支付我们的人生吧! 6464

【算法】反转链表的四种方法(C语言)

新建链表法,递归,迭代,原地反转。

Patrick_yuxuan的博客 1万+

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 630

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1235

如何反转一个链表

最近在刷Leetcode中关于链表的题,发现很多题都涉及到了了链表的反转 给出一个链表[1, 2, 3, 4, 5] 反转为[5, 4, 3, 2, 1] 解决该问题可以用循环解决,而核心思想便是在循环中每次只让第I个元素插入到链表的头部 在循环之前链表长这样 1-> 2-> 3-> 4-> 5 第一次循环 2-> 1-> 3-> 4-> 5 第...

eye_water的博客 1万+

MFC实现简单UDP通信(附完整源码)

MFC实现简单UDP通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1113

反转链表详解

这些数据项通常以链表的形式组织起来,其中最近使用的数据项位于链表的头部,最久未使用的数据项位于链表的尾部。反转链表指的是将链表的头尾节点对调,使得原本链表的第一个节点变为最后一个节点,原本链表的最后一个节点变为第一个节点,其他节点的相对位置也进行相应调整。通过对反转链表算法的深入理解和实践应用,我们可以更好地掌握链表的基本操作和指针的使用,并提高编程能力和解决问题的能力。然而,锁的使用会降低程序的性能。在实际应用中,我们可能需要在反转链表的同时进行其他操作,例如计算链表长度、检查链表中的重复元素等。

Weirdo的博客 3082

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

反转链表、链表内指定区间反转

链表(Linked List)是一种线性数据结构,其中的元素(通常称为节点)按顺序排列,每个节点包含两部分信息:存储数据的部分和指向下一个节点的指针或引用。链表中的每个节点通过指针连接在一起,因此它不需要在内存中连续存储。

fakerth的博客 1487

Camera2Demo

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

反转链表与分组反转链表

1.反转链表 经典的反转链表,先上代码 public class ListNode { int data; ListNode next; public ListNode(int data) { this.data = data; } } public class PrintList { public static void print(ListNode root) { while (root != null) {

bitcarmanlee的博客 812

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法 链表 反转链表

链表是一种常用的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的链接。反转链表是链表操作中的一个经典问题,不仅在面试中经常被问到,而且在实际项目中也有广泛的应用。这个问题可以通过先找到第 m 个节点,然后反转从第 m 到第 n 的节点,最后再将反转后的部分重新连接到原链表中来解决。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。递归法利用了递归的思想,每次将当前节点的后续部分反转,然后将当前节点连接到反转后的链表末尾。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1094

链表学习反转链表

链表是一种线性数据结构,其中元素不是连续存储在内存中的,而是通过指针连接起来。每个节点包含两部分:数据域和指向下一个节点的指针域。链表分为单向链表和双向链表,本文主要讨论单向链表的反转。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1248

反转链表及链表内指定区间反转

通过遍历,每一个节点的next指向前一个节点 首先有两个指针,指向前一个节点,previous,指向当前节点,current。 实现反转链表,使每个节点的next指向前一节点。但是current的next断开,就找不到当前节点的下一个节点了,所以需要next,用于保存当前节点的next。 next = current.next 下面进行第一次反转 断开 指向前一个节点 current.next = previous 将前一个节点的指针后移 previo...

linxuanasd的博客 2393

链表之反转链表专题

链表之反转链表专题 如题,LeetCode 206 看到反转链表,我们要思考的核心点在于如何让链表的结点指针指向的方向反转 对于反转链表,一般有迭代或者递归两种思考方向 第一种:迭代 在这种方案中,做题总结出了双指针迭代比较高效,同时有一种双指针的迭代公式 具体的动画效果可以参考LeetCode官方题解 题解动画 while(cur!=null) { //记录当前节点的下一个节点 tmp = cur.next; //然后将当前节点指向pre cur.next = pre; //pre和cur节点

子冉冰清的博客 3652

leetcode链表反转总结——全部翻转,部分反转

leetcode链表反转(递归)总结——全部翻转,部分反转 参考:步步拆解:如何递归地反转链表的一部分 由于链表反转使用迭代的思路进行实现比较简单,只是写法上比较复杂,所以这里仅整理记录一下递归反转链表的解法 一.全部反转 1.1 题目 使用递归反转链表,并返回链表 1.2 解法 /** * 递归反转链表 * @param head * @return */ public static ListNode reverseList(ListNode

weixin_44844089的博客 2487

链表反转(全链表反转、链表区间反转)

全链表反转 /** * Reverse a linkedList, for example * 1 -> 3 -> 5 -> 7 -> 9 * 9 -> 7 -> 5 -> 3 -> 1 * @param head * @return */ public static ListNode reverse(ListNode head) { ListNode cur = head; ListNode prev = null; .

weixin_45744426的博客 810

反转链表、旋转链表算法总结

1. 反转链表(力扣:206) 2. 反转链表 II(力扣:92) 3. 旋转链表(力扣:61)

卜大爷的博客 2万+

反转各种链表

206反转链表 题目描述如下: 按题目要求,用两种方法来实现。 方法一: 利用两个指针不断迭代实现,代码如下: class Solution { public: ListNode* reverseList(ListNode* head) { ListNode * new_head=NULL; //定义一个空指针 while(head) ...

weixin_42058099的博客 360
上一篇: 基于RMI和C-S的服务发现
下一篇: LeetCode-21-合并两个有序链表
CodAlun
博客等级 码龄8年 46粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值