单链表反转两种方法

IMU预积分【SLAM】 预积分的推导过程比较多,所以这里只记录关键结论。 其实这些公式不太好记忆,因为预积分推导过程的想法来源很巧妙,无法看出物理意义。一切推导的来源: 最好记忆的旋转相对运动量: △Rij≐RiTRj=∏k=ij−1Exp((ω~k−bg,k−ηgd,k)△t)\triangle R_{ij} \doteq R_{i}^{T}R_{j} = \prod_{k=i}^{j-1}Exp((\tilde{\omega}_{k}-b_{g,k}-\eta_{gd,k})\triangle t) △Rij​≐RiT​Rj​ 阅读详情

最近同学介绍了一个lettcode(力扣)OJ给我,个人认为这个网站比母校的oj,杭电oj界面友好很多,题库充足,且支持多种主流语言,很适合闲时刷刷提高算法能力,算法的练习如同内功的修炼,碰到算法问题,经常有一种无力感,只能慢慢总结了。

链表是一种重要的数据结构,因为有递归性质,所以总是难以理解,涉及链表的复杂操作总是感觉一头雾水,看别人的实现代码总是似懂非懂,看完就忘,实际上就是没有理解透彻,特意花了一天时间重新学习了单链表的常见操作-单链表反转,理解和总结两种实现方法。

首先要了解一个链表节点的数据结构:
在这里插入图片描述

value代表该节点存储的值,next指向下一个节点,next可能指向一个单一节点,也可能指向一个链表,也可能指向null(代表尾节点)。
方法一:头节点插入法

实现步骤:

 

  1. 创建一个带头节点的链表resultList
  2. 定义一个循环链表变量p,p的初始值为待反转的链表
  3. 遍历待反转的链表,遍历条件为 (p !=null)
    3.1 定义一个临时链表变量tempList保存p->next的值(因为p->next值会改变),用于下一次循环。
    3.2 把p当前指向的首节点和resultList链表的头节点之后的节点拼接起来。
    3.3 把3.2步骤中拼接的节点 再拼接到resultList头节点后。
    3.4 p重新赋值为3.1步骤中保存的tempList的值。
  4. 返回resultList->next.即反转后的链表。

图解:
在这里插入图片描述

图1就是待反转的原始链表,图2是 带头节点的链表resultList。
可以看到p是一个循环变量,初始值指向待反转的原始链表。
通过p变量遍历链表,在遍历中(列举的值为第一次循环的情况):

  • 定义一个临时链表变量tempList保存p->next的值,tempList指向图1.2
  • 把p当前指向的首节点(图1.1)和resultList链表的头节点之后的节点(图2.2)拼接起来。
  • 把3.2步骤中拼接的节点(图3.2) 再拼接到resultList头节点后。
  • p重新赋值为3.1步骤中保存的tempList的值,即图1.2。

最后返回resultList->next,也就是去除了头节点-1的值。

通过头结点插入法实现链表反转功能,主要难点就是在循环中的3.2和3.3步骤的理解。
需要注意的是,就是关注循环变量p的值,也就是指向的变化,传统的遍历过程就是条件为p!=null,处理,p=p->next。但是在这个头结点插入代码中,p->next的值发生的变化,因为要将resultList结果链表的内容拼接到p的首节点后,所以要定义一个临时变量存p->next。
 

方法二:就地反转

头结点插入法的实质是重新创建了一个新的链表,通过遍历待反转链表,将链表每一个节点插入到创建的链表中,然后的到的这个创建的链表就是反转后的链表。而就地反转实质就是在待反转链表基础上修改节点顺序得到反转链表。所以原理还是不同的。

图解:
在这里插入图片描述

个人认为就地反转比头结点插入稍微难理解一点。
宏观上来看,要实现节点1和节点2反转,需要将节点1插入节点2和节点3当中,然后将头节点为2的链表插入结果链表头结点后面,然后再后移一个节点做同样的操作。
然而涉及到两个节点的循环赋值,这个操作顺序就比较重要了。
正确的步骤是先将节点2切分出来,再将节点2插入-1和1之间。
 

实现步骤

 

  1. 创建一个带头节点的链表resultList,头结点指向待反转的链表。
  2. 创建p、pNext两个用于循环操作,分别指向两个待反转节点的位置,初始值如图所示,指向1和2
  3. 遍历带反转的链表,循环条件是pNext!=null.
    3.1 从链表中分割出pNext节点,也就是让p指向pNext->next。
    3.2 让pNext指向经过3.1操作之后的resultList.next(1->3->4->5)
    3.3 让resultList头结点指向pNext(2->1->3->4->5)
    3.4 让pNext指向p的下一个节点

难点在于理解循环中resultList.next指向性的变化,以及p和pNext两个变量的变化,p指向的链表首结点永远是1,只是节点1在resultList链表中位置在发生变化,而pNext是随着p移动的,脑子中间可以有一个摆绳模型,在起始点位置发力,绳子的高点位置会移到绳尾,那个最高点就是p变量位置。
代码实现:

 

头结点插入:

    public static ListNode reverseListByInsert(ListNode listNode){
        //定义一个带头节点的
        ListNode resultList = new ListNode(-1);
        //循环节点
        ListNode p = listNode;
        while(p!= null){
            //保存插入点之后的数据
            ListNode tempList = p.next;
            p.next = resultList.next;
            resultList.next = p;
            p = tempList;
        }
        return resultList.next;
    }

就地反转:

public static ListNode reverseListByLocal(ListNode listNode){
        ListNode resultList = new ListNode(-1);
        resultList.next= listNode;
        ListNode p = listNode;
        ListNode pNext = p.next;
        while (pNext!=null){
            p.next = pNext.next;
            pNext.next = resultList.next;
            resultList.next = pNext;
            pNext=p.next;
        }
        return resultList.next;
    }

单链表的操作困扰了很多年,或许还将困扰下去,但是至少有了更加深入的认识。这部分内容确实相对有点难以理解。推荐的学习方法就是先看别人代码,再画图了解代码的每一个过程,再根据画的图独立写代码实现,然后再调试debug,查看变量变化情况,再找类似练习题,多想多练。(就地反转的方法还需要细讲)。

CAN信号定义避坑指南:Kvaser Database Editor里Byteorder和Bitpos设置的那些‘坑’ 本文详细解析了在Kvaser Database Editor中配置CAN信号时,字节序(Byteorder)和起始位(Bitpos)设置的常见错误及解决方案。通过实际案例和验证技巧,帮助工程师避免DBC文件配置中的陷阱,确保车载电子系统的稳定通信。 阅读详情

相关推荐

ABB机器人常见的几大数据类型

ABB机器人数据存储描述了机器人控制器内部的各项属性,ABB机器人控制器数据类型多达100余种,其中常见的数据类型包括基本数据、i/o数据、运动相关数据。 1、基本数据 基本数据: bool 逻辑值:逻辑状态下赋予的真或者假。逻辑值有两种情况:成立和不成立则逻辑值为真使用true或1表示不成立则逻辑值为假使用false或0表示 byte 字节值:用于计量存储容量的一种计量单位,取值范围为(0-255) num 数值:变量、可存储整数或小数整数取值范围(-8388607~8388608) dnum

soinlove36的专栏 1万+

如何将单链表逆转(超详细)

单链表逆转的方法有很多,我也从很多博主那学习看到了各种各样的方法。今天就给大家总结一下个人认为较简便的四种方法。这四种方法不用开辟新的空间,所以不会造成空间浪费。 方法一:迭代 采用迭代的基本思路如下:我假设链表为1->2->3->4,那么但我完成链表的逆转后就应该是4->3->2->1。我将链表的头结点设为L,同时开辟两个新的节点q和p,我将利用L,q,p三个节点来进行迭代。 List Reverse(List L) { List p, q; .

weixin_55859275的博客 1万+

封神台靶场,为了小芳,冲之——cookie注入

第二个靶场 打开网站 找一下注入点 一般在新闻这种里面点开看看 先判断是否存在注入 有waf 尝试了很多方法绕过都没成功,/and/,aandnd,AnD等一系列都没绕过去,乌鸡鲅鱼 删掉id=169 发现 然后判断cookie注入 在搜索框输入 Javascript:alert(document.cookie=”id=”+escape(‘169’)); 然后弹窗了(其中 “id=” 取决URL中的id= escape中的数值也是URL中id=的值)返回刚刚的页面,把ID删除后一样能正常显示。说明服务器能

Wubuqing的博客 651

单链表反转(逆置)——(四种方法实现)

链表逆置就是把最后以一个提到坐前面,倒数第二个放到第二个……直到第一个到最后一个。 由于链表没有下标,所以不能借助下表来实行数据的逆置,要靠空间的转移来完成链表的逆置 这里采用没有头节点的链表来实现逆置。 第一种——头插法 算法思想:逆置链表初始为空,表中节点从原链表中依次“删除”,再逐个插入逆置链表的表头(即“头插”到逆置链表中),使它成为逆置链表的“新”的第一个结点,如此循环,直至原链表为空。 #include <stdio.h> #include <stdli...

m0_58397166的博客 8万+

离线安装 nvidia-docker2(nvidia-container-toolkit)

很多时候大家都有用docker使用gpu的需求,但是因为网络等原因不是那么好用,这里留了一个给ubuntu的安装包,网络好的话也提供了在线安装方式。

father_yingying的博客 1181

高通跃龙QCS6490部署yolov11_obb实战:QNN SDK工具链全解析与避坑指南

本文详细解析了在高通跃龙QCS6490平台上部署yolov11_obb模型的实战过程,重点介绍了QNN SDK工具链的使用与优化技巧。从环境配置、模型转换到性能调优,提供了全面的避坑指南和DSP加速配置建议,帮助开发者高效实现旋转框检测任务在边缘设备上的部署。

weixin_29232121的博客 304

链表:自引用结构

链表: 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。 例: #include typedef struct student {

和光official的博客 1296

详细介绍用MATLAB实现基于A*算法的路径规划(附完整的代码,代码逐行进行解释)(一)--------A*算法简介和环境的创建

   本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示。    一、 A*算法简介       A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。      公式表示为: f(n)=g(n)+h(n),其中, f(n) 是从初始状态经由状态n到目标状态的代价估计,g(n) 是在状态空间中从初始状态到状态n的实际代价,h(n) 是从状态n到目标状态的最佳路径的估计代价。

慕羽★的博客 7万+

图解:单链表反转的三种方式!

当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转。 单链表反转,反转后的效果如下: 看起来很简单,只需要将单链表所有结点的 next 指向,指向它的前驱节点即可。引入一个栈结构,就可以实现。 栈实现的链表反转 在原本链表的数据结构之外,引入一个栈(数组也可),将单链表循环遍历,将所有结点入栈,最后再从栈中循环出栈,记住出栈的...

Android 开发架构 4087

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 310

微信小程序 - 最新图片组拖拽排序更换位置功能,类似微信朋友圈九宫格图片的拖动排序效果,微信小程序实现九宫格图片拖拽调换位置,小程序详细实现图像拖曳拖动切换位置排序功能(详细示例代码,一键复制开箱即用

微信小程序,wechat,小程序,图片排序,图像排序,九宫格拖拽排序,拖曳,拖动,拖拽,仿微信朋友圈,朋友圈宫格图片排序,微信朋友圈图片拖动排序效果,实现九宫格图片拖拽,图像拖拽排序组件插件,小程序实现拖拽图片切换图片位置,图片拖动互换位置,图像拖拽切换位置,九宫格图片组合拖动排序,交换九宫格图片的位置,小程序上传图片后,如何实现拖拽排序功能,小程序怎么实现图片拖拽排序,微信小程序图片上传,九宫格拖拽组件,选择图片并拖动_微信小程序图片拖拽,微信小程序长按拖拽排序,图像的拖拽移动,多图拖拽排序功能,实现九宫

✅ 精选推荐文章 4453

反转单链表四种方法整理

反转单链表四种方法前言一、反转单链表之迭代法1.迭代法文字描述2.迭代法图解示意3.迭代法的代码二、反转单链表之递归法1.递归法的文字描述2.递归法的图解3.递归法的代码三、反转链表之头插法1.头插法文字描述2.头插法图解3.头插法代码四、反转链表之就地反转法1.就地反转法文字描述2.就地反转法图解3.就地反转法代码 前言 反转单链表算法的四种方法合集,自己自学整理,如有错误或是表达有问题之处可以指出,之后若有时间我会对错误之处进行修改尝试,完善本篇内容,谢谢。 一、反转单链表之迭代法 1.迭代法文.

weixin_46097480的博客 1568

EtherCAT ROS2 入门教程(一)

本文介绍了EtherCAT驱动与ROS2的集成方案,主要包括三部分内容:1)在Ubuntu 22.04上安装IgH EtherCAT主站的详细步骤,包括内核配置、源码编译和网络适配器设置;2)构建ethercat_driver_ros2,通过ros2_control描述文件配置硬件接口和EtherCAT从站模块插件;3)使用方法,包括启动EtherCAT主站和运行配置包。该方案支持通过参数文件定义硬件接口,并提供通用和专用两种EtherCAT模块插件,便于开发基于EtherCAT的工业应用。

机器人控制与仿真应用 1528

单链表的反转(两种方法)

第一种方法:通过头插法反转单链表 public ListNode reverse1(){ ListNode cur=this.head.next; ListNode newHead=this.head; newHead.next=null; while(cur!=null){ ListNode node...

qq_42174669的博客 270

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

单链表反转的两种方法

#include <iostream> /*单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。 * 比如一个链表是这样的: 1->2->3->4->5 * 通过反转后成为5->4->3->2->1。 */ using namespace std; //链表 class List { public: List(int data= 0):data(data) { next= nullptr;

m0_46615101的博客 436

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C语言两种方法实现单链表反转

C语言两种方法实现单链表反转(迭代法、递归法)

fatherofli的博客 4987

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

两种方法反转单链表

Java代码 /** * @author luochengcheng * 定义一个单链表 */ class Node { //变量 private int record; //指向下一个对象 private Node ne...

weixin_34106122的博客 193

单链表反转/逆序的两种方法

单链表反转/逆序的两种方法  比较两种思路的差异 在 2012年07月05日 那天写的     已经有 65184 次阅读了 感谢 参考或原文 服务器君一共花费了80.036 ms进行了3次数据库查询,努力地为您提供了这个页面。 试试阅读模式?希望听取您的建议   前面我们大约把单链表 ADT 的基本操作都过了一遍,但是这

boshuzhang的专栏 1031

python单链表逆序_单链表反转/逆序的两种方法

前面我们大约把单链表 ADT 的基本操作都过了一遍,但是这还不够。单链表在面试与笔试中出现的几率很高,接下来我们再花点时间把常见的单链表面试题尽可能过一遍,彻底掌握单链表~那开始我们的第一个面试题?不妨做做“单链表反转”,或者说“单链表逆序”吧?还是基于前面的例子。究竟要如何反转呢?我们不妨拿一个例子来说明一下算法。我先画一个单链表,这个单链表有4个元素。我的思路就是,每次把第二个元素提到最前面来...

weixin_39954698的博客 814

C语言两种方法实现单链表反转(迭代与递归)

C语言两种方法实现单链表反转(迭代与递归)

m0_63666616的博客 5052

(28)单链表的两种反转方法

一.将原链表的节点按照顺序一个一个插入到新链表中。 代码: Linkedlist Reversal(Linkedlist head) { Linkedlist newNode = NULL; for (Linkedlist p = head; p;) { Linkedlist temp = p->next; //保存前一结点 p->next = newNode;

革命队伍的螺丝钉 372

【单链表】用递归和循环两种方法来反转单链表

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { //这里输入数据会有空的,所以返

Currybeefer的博客 503
上一篇: Java并发编程之ConcurrentLinkedQueue详解
下一篇: jvm查看full gc频率
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值