图解反转链表的4种方法

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


声明:本文为博主原创文章,未经允许不得转载。如有问题,欢迎指正!

206. 反转链表 (简单)
题目描述:

反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
链接:https://leetcode-cn.com/problems/reverse-linked-list/

方法一:

遍历原链表,把“当前结点”按照头插法添加到新链表中。思路简单,图解略去。

 / /java代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    ListNode Reverse=null;    / /定义新链表
    ListNode temp=head;       / /temp用于遍历
    while(temp!=null){        
    ListNode cur=new ListNode(temp.val);  / /生成新结点
    if(Reverse==null) Reverse=cur;    / /Reverse为空时直接指向新结点   
    else{             / /Reverse非空时执行头插:   
    ListNode p=Reverse;    / /1.用p标记Reverse(记录头结点)
    Reverse=cur;           / /2.Reverse指向新结点cur (更改头结点) 
    Reverse.next=p;        / /3.新的头结点与之前链表连接
    }
    temp=temp.next;    
    }
    return Reverse;
    }
}
方法二:

== 双指针解法== 既然是反转,就把原来的“指向”反过来。遍历链表,把当前结点cur指向cur的上一个结点,因为单向链表不能“由当前结点知道上一个结点”,故用pre记录前一个结点。如果只有前面的操作,那cur原本的后继结点就找不到了,故应该先用record将其保存。

/ /java代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur=head;   / /cur用于遍历链表
ListNode pre=null;/ /pre为当前结点cur的上一个结点。初始化为null,因为最开始的pre最终变为尾
while(cur!=null){
ListNode record=cur.next; / /1.记录cur的下一个结点,以防在 cur.next=pre 后找不到“原来的下一个”
    cur.next=pre;         / /2.当前的“指针”指向上一个
    pre=cur;              / /3.pre后移
    cur=record;           / /4.cur指向下一个结点
    } 
    return pre;
    }
}
方法二图解

以下是链表为1->2->3->4->null 时具体的双指针操作过程示例:
在这里插入图片描述

方法三:

迭代法:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    ListNode cur=head;
    if(head==null) return null;
    while(head.next!=null){
    ListNode record=head.next.next;
    head.next.next=cur;
    cur=head.next;
    head.next=record;

    }
    return cur;

    }
}
方法三图解

以下是链表为1->2->3->4->null 时具体的迭代过程示例:
在这里插入图片描述

方法四:

递归解法:递归解法可由迭代演化过来。(大部分迭代和递归都可以相互转化)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
    if(head==null||head.next==null)  return  head;
    ListNode newHead=reverseList(head.next);
    head.next.next=head;      
    head.next=null;
    return newHead;
    }
}
方法四图解

以下是链表为1->2->3->4->null 时主要的调用和回退过程(橙色结点为递归或回退到的“当前结点”):
在这里插入图片描述

上一篇博客:leetcode 78 子集 (位运算)

反转单链表的4种方法(C语言实现) 本节仅以无头节点的链表为例,讲解了实现链表反转的 4 种方法。使用迭代反转法实现时,初始状态忽略头节点(直接将 mid 指向首元节点),仅需在最后一步将头节点的 next 改为和 mid 同向即可;使用头插法或者就地逆置法实现时,仅需将要插入的节点插入到头节点和首元节点之间即可;递归法并不适用反转有头结点的链表(但并非不能实现),该方法更适用于反转无头结点的链表。结合以上说明,读者可尝试修改本节代码,使它们能用于反转带头节点的链表。对于反转没有头节点的链表,读者可从反转无头节点链表下载; 阅读详情

相关推荐

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 1万+

反转链表的四种方式

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

2301_79977698的博客 8513

AI初识—LLM、Ollama、Llama都是些个啥?

LLM指的是大语言模型(Large Language Model),是一种基于深度学习的模型,能够理解和生成自然语言。它通过大量文本数据进行训练,具备了理解上下文、生成连贯文本和回答问题的能力。著名的LLM包括OpenAI的GPT系列和Google的BERT。在AI技术快速发展的背景下,LLM、Ollama和Llama代表了现代自然语言处理的不同方面。LLM为我们提供了强大的语言理解能力,Ollama为模型的部署和管理提供了便利,而Llama则在效率和多样性上不断推进。

小蜗牛的珍贵百宝箱 4629

反转链表的四种方法

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

z3551906947的博客 1万+

From Manual to Magic: How nnU-Net is Revolutionizing Biomedical Image Segmentation Without Human Int

本文探讨了nnU-Net如何通过全自动深度学习技术革新生物医学图像分割领域。作为自我配置的智能系统,nnU-Net无需人工干预即可完成从数据预处理到模型训练的全流程,显著提升医学影像分割的效率和精度,尤其在CT和MRI影像分析中表现卓越。

metal的博客 1083

手把手教你用Arduino Uno控制meArm机械臂(附完整代码+避坑指南)

本文提供了一份详尽的meArm机械臂控制指南,涵盖从Arduino Uno硬件连接到Servo库编程的完整流程。重点讲解了如何通过独立供电、软件限位和平滑运动函数实现稳定控制,并设计了串口指令协议与高级功能,帮助创客有效规避舵机抖动、电源不足等常见问题,让机械臂运行更流畅可靠。

gpt4scribbler的博客 541

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

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

weixin_63834061的博客 6869

fanuc机器人KAREL中 函数的应用

本次课程讲解编程的思路。很多的同学都玩过积木,一个一个的模块逐渐累积起来,通过彼此之间的相互联系,最终形成一个完整的整体。其实编程也是这样。 将一个对象根据其特点进行模块化拆分,尤其是一些特点非常相似的内容,将其变成一个模块。然后通过传递参数,实现不同的功能,这就是模块化编程。

haier123888的博客 2744

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

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

Patrick_yuxuan的博客 1万+

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2840

OSG第三方库编译之二十一:minizip编译(Windows、Linux、Macos环境下编译)

OSG编译;第三方库;跨平台编译;minizip编译(Windows、Linux、Macos环境下编译)

LuckyHanMo的博客 2621

【基础算法】反转链表的三种方法

【基础算法】反转链表的三种方法

4346

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

图解反转链表的4种方法((转载)

图解反转链表的4种方法 206. 反转链表 (简单) 题目描述: 方法一: 方法二: 方法二图解 方法三: 方法三图解 方法四: 方法四图解 声明:本文为博主原创文章,未经允许不得转载。如有问题,欢迎指正! 206. 反转链表 (简单) 题目描述: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 链接:https://leetcode-cn.com/problems/reve

zhongqill的博客 278

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

图解反转链表的4种方法(转载)

图解反转链表的4种方法 206. 反转链表 (简单) 题目描述: 声明:本文为博主原创文章,未经允许不得转载。如有问题,欢迎指正! 206. 反转链表 (简单) 题目描述: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 链接:https://leetcode-cn.com/problems/reverse-linked-list/ 方法一: 遍历原链表,把“当前结点”按照头

shuirenbushijun的博客 293

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言

LeetCode 206.反转链表4种方法图解(①就地反转②头插法③迭代法④递归法)Java语言 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? ①就地反转 就地反转即:不增加新的链表在该链表上进行反转 原链表:dumm...

weixin_44438340的博客 929

LeetCode hot 100 每日一题(18)——206.反转链表

力扣206.反转链表

m0_46464899的博客 226

反转链表--迭代和递归

1,leetcode网址 https://leetcode-cn.com/problems/reverse-linked-list/ 2,题目 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 3,源码: class Solution { p...

a80C51的博客 246

图解链表反转系列Leetcode

链表反转系列

code120302的博客 999

单链表反转,我们从递归说起,图解带你彻底搞懂

单链表反转,我们从递归说起,图解带你彻底搞懂....递归和迭代,看完图解和动画,豁然开朗!

iqqcode 4004

图解反转单向链表

我总觉的反转链表的过程不是那么好理解,花了点时间画图来帮助理解

yinhuanxu 8284

反转链表的方法

反转链表(Reversing a Linked List)是链表操作中一个比较常见且重要的问题。反转链表的原理和实现思路并不复杂,但理解其背后的思想有助于更好地掌握链表的操作以及指针操作的逻辑。反转链表的思想主要是通过逐步反转链表节点的指针方向,使链表的头节点变为尾节点,尾节点变为头节点,实现整个链表的“翻转”。

tuxiantian的专栏 2051

看一遍就理解,图解单链表反转

前言反转链表是程序员必备的基本素养,经常在面试、笔试的过程中出现。一直觉得反转链表实现代码不是很好理解,决定搬leetcode那道经典反转链表题出来,用十多张图去解析它,希望加深大家对链...

weiwenhou的博客 1640

数据结构和算法(三)图解单向链表反转

1. 数据结构和算法(三)图解单向链表反转   所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。 一直觉得反转链表实现代码不是很好理解,今天用画图的方式去理解它。 1.1 需求分析 反转链表需求: 输入:[HBase,Redis,Kafka] 输出:[Kafka,Redis,HBase] 分析: 存在链表 HBase → Redis → Kafk...

yuan_xw的专栏 696

使用递归实现链表反转

使用递归实现链表反转

Thano_xu的博客 4892

反转单链表四种方法整理

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

weixin_46097480的博客 1568
上一篇: leetcode 78 子集 (位运算)
下一篇: leetcode 328.奇偶链表
准图灵奖得主
博客等级 码龄8年 355粉丝 135原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值