力扣206 - 反转链表【校招面试高频考题】

简介: 力扣206 - 反转链表,一道校招中笔试面试链表章节中【非常高频】的考题

@TOC

一、题目描述

原题传送门
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:
在这里插入图片描述

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:
在这里插入图片描述

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

二、思路分析

好,看完题目的描述,我们来分析一下去求解这道题目
  • 对于本题,是校招面试中的高频考题,所以我要专门拿出来做讲解,这题的思路并不难,考验的是你对于链表结构的基本功,接下来我们一起来分析一下
  • 对于本题,我会讲解两种方式,一种是利用头插,一种是利用三指针迭代。两种方法的思路很相似,但是本质却不同,听我给你道来

1、头插

  • 对于头插这一种方法,也就是将结点一一地插入到链表的头后,所以我们需要先去建立出一个新的链表头,也就是我下面的这个【rhead】,通过去遍历原先的链表将这些结点一一转移过去即可
  • 但是在一个结点转移后下一个结点就找不到了,于是我们需要先去保存下一个结点
在这里插入图片描述
  • 然后让【cur】的next去指向【rhead】,然后更新rhead和cur的值
在这里插入图片描述
  • 然后我们通过保存下一个结点继续去进行一个头插
在这里插入图片描述
  • 继续头插【2】结点,做结点指针的更新
在这里插入图片描述
  • 同理
在这里插入图片描述
  • 同上
在这里插入图片描述
  • 此时当【cur == NULL】时,便结束一个遍历,然后新链表的头就是【rhead】,返回即可
在这里插入图片描述
  • 可以看出,这其实并不算真正意义上的头插,对于头插法,大家最熟悉的应该是
newnode->next = head->next;
head->next = newnode;
  • 下面这种叫做带头结点的插入,我上面这种是不带头结点的,这个大家要做好区分
  • 代码在后面给出

2、三指针迭代

  • 然后我们再来讲一讲三指针的迭代方法,这种方法不需要在去创建一个新的头结点指针,只需要在原先的链表上进行一个操作即可,也就是定义三个指针,一个【cur】指向当前链表的头,一个【nextNode】指向cur的next,一样是用于保存,还有一个则是【prev】,这个的话其实是用来算作链表最后一个结点指向空的,初始化就像下面这样
在这里插入图片描述
  • 然后执行一个循环的逻辑,将【cur->next = prev】,让原本的头【cur】作为反转后新链表的尾巴,接着就是进行的一个迭代操作,首先将【cur】当前的值给到【prev】,然后将【nextNode】当前的值给到【cur】,然后让【nextNode】继续向下,这个时候其实就进行了一个迭代的操作
在这里插入图片描述
  • 然后继续做翻转,让【cur->next】指向prev
在这里插入图片描述
  • 同理
在这里插入图片描述

在这里插入图片描述

  • 可以看到,当这个【cur == NULL】时,整个链表便完成了一个翻转,此时便结束循环迭代的逻辑
在这里插入图片描述
  • 然后可以看到,此时新链表的头并不是【cur】,而是【prev】,所以最后应该返回【prev】
  • 代码一样在下一模块给出

三、整体代码展示【需要自取】

1、头插

这里展示一下整体代码,将上面我们的解说进行代码的一个转化
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* rhead = NULL;
        while(cur)
        {
            ListNode* nextNode = cur->next;     //优先保存cur的next结点
            //头插
            cur->next = rhead;
            rhead = cur;

            cur = nextNode;
        }
        return rhead;
    }
};

2、三指针迭代

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head == NULL)
            return NULL;
        ListNode* prev = NULL;
        ListNode* cur = head;
        ListNode* nextNode = cur->next;

        while(cur)
        {
            cur->next = prev;

            //迭代
            prev = cur;
            cur = nextNode;
            if(nextNode)
                nextNode = nextNode->next;
        }
        return prev;
    }
};

四、总结与提炼

  • 最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关链表翻转的题目,这道题目是校招笔试面试中有关链表章节==非常高频==的一道题目,大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握
以上就是本文所要描述的所有内容,感谢您对本文的观看,如有疑问请于评论区留言或者私信我都可以:four_leaf_clover:
相关文章
|
11月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
117 1
|
3月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
3月前
|
算法 Java 关系型数据库
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
78 2
|
3月前
|
缓存 NoSQL Java
校招 Java 面试常见知识点及实战案例全解析
本文全面解析了Java校招面试中的常见知识点,涵盖Java新特性(如Lambda表达式、、Optional类)、集合框架高级应用(线程安全集合、Map性能优化)、多线程与并发编程(线程池配置)、JVM性能调优(内存溢出排查、垃圾回收器选择)、Spring与微服务实战(Spring Boot自动配置)、数据库与ORM框架(MyBatis高级用法、索引优化)、分布式系统(分布式事务、缓存应用)、性能优化(接口优化、高并发限流)、单元测试与代码质量(JUnit 5、Mockito、JaCoCo)以及项目实战案例(电商秒杀系统、社交消息推送)。资源地址: [https://pan.quark.cn/s
139 4
|
3月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
94 2
|
3月前
|
Java 关系型数据库 MySQL
2025 年互联网公司校招 Java 面试题总结及答案实操示例解析
本项目基于Spring Boot 3与Java 17技术栈,围绕校园招聘常见面试题,提供核心知识点的实操示例。涵盖多线程、RESTful API设计、数据库操作(Spring Data JPA)、事务管理及异常处理等。通过完整代码实现与运行步骤,帮助理解用户管理、线程池配置等实际应用场景。资源包含项目结构、关键代码示例(如User实体类、UserService服务层、ThreadService多线程实现)及数据库迁移脚本,适合深入学习与实践。环境要求:JDK 17+、Maven 3.8+、MySQL 8.0+。
143 3
|
3月前
|
安全 Java 编译器
Java 校招面试题目合集及答案 120 道详解
这份资料汇总了120道Java校招面试题目及其详细答案,涵盖Java基础、JVM原理、多线程、数据类型、方法重载与覆盖等多个核心知识点。通过实例代码解析,帮助求职者深入理解Java编程精髓,为校招面试做好充分准备。无论是初学者还是进阶开发者,都能从中受益,提升技术实力和面试成功率。附带的资源链接提供了更多学习材料,助力高效备考。
116 3
|
3月前
|
存储 算法 Java
校招 java 面试基础题目及解析
本文围绕Java校招面试基础题目展开,涵盖平台无关性、面向对象特性(封装、继承、多态)、数据类型、关键字(static、final)、方法相关(重载与覆盖)、流程控制语句、数组与集合、异常处理等核心知识点。通过概念阐述和代码示例,帮助求职者深入理解并掌握Java基础知识,为校招面试做好充分准备。文末还提供了专项练习建议及资源链接,助力提升实战能力。
118 0
|
3月前
|
存储 设计模式 算法
校招 Java 面试常见知识点汇总及备考指南
本文全面解析校招Java面试常见知识点,涵盖Java基础、集合框架、多线程并发、JVM等内容。从面向对象特性(封装、继承、多态)到数据类型与包装类,再到字符串处理和关键字用法,逐一剖析。集合框架部分深入讲解List、Set、Map接口及其常用实现类的特性和应用场景。多线程章节探讨线程创建、同步机制及线程池的使用。JVM部分聚焦内存区域、垃圾回收机制和类加载过程。结合实际案例,助你轻松应对校招面试!资源地址:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
100 0
|
5月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
171 10