【数据结构算法篇】链表面试必刷题1——反转链表

简介: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

题目描述

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

数据范围: 0 ≤ n ≤1000


要求

空间复杂度 O(1) ,时间复杂度 O(n)O(n) 。

如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。

以上转换过程如下图所示:

26.png


输出样例

示例1:

输入:{1,2,3}

返回值:{3,2,1}

实例2:

输入:{}

返回值:{}

说明:空链表则输出空


解决问题的思路

对于数据结构的题,最好还是一边画图一边思考问题。这个题我简单画了一下图,如下:

27.png

图画的不是很好,大家凑合着看一下吧,画图可以为我们提供方很多思路,看着这张图,我们就可以知道这个题的目的就是让我们改变链表每个节点的指向

这个题就很简单了,用头插法就可以解决这个问题。

我们可以先找到第二结点,然后把从第二个结点开始之后的结点依次用头插法放在第一个结点的前面。

其实在这里有一个问题需要大家注意一下,就是我用头插法插完之后,不能直接把指针域给改变了,否则就会找不到下一个节点了。看下图:

28.png

链表本身就只是逻辑上的连续,靠着指针域找到下一个结点。这里将第二个结点放在头结点后,如果将它的指针域修改之后,它就与后面的结点断开了联系,就找不到后面的结点了。在这里看上去不是特别明显,只有三个结点,但如果是很多个结点,那么就会丢掉很多个结点。

要解决这个问题也很简单,只要我们每次把要进行头插的结点和它的下一个节点都存下来就没问题了。

当然数据结构是一门逻辑非常严谨的学科,在实例2中给了空链表的问题,如果没有给我们空链表实例我们也要考虑到。不只有空链表,还有只有一个结点的链表的这种情况,只有一个结点那就不需要反转了,直接返回这个结点就可以了。


代码实现

/*

public class ListNode {

   int val;

   ListNode next = null;

   ListNode(int val) {

       this.val = val;

   }

}*/

public class Solution {

   public ListNode ReverseList(ListNode head) {

       //空链表

       if(head == null){

           return null;

       }

       //结点只有一个

       if(head.next == null){

           return head;

       }

       ListNode cur = head.next;

       head.next = null;

       while(cur != null){

           ListNode curNext = cur.next;

           cur.next = head;

           head = cur;

           cur = curNext;

       }

       return head;

   }

}

33.png

————34.png————————————

版权声明:本文为CSDN博主「二月知野」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_63463510/article/details/126962752

相关文章
|
4月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
219 3
|
11月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
190 4
|
7月前
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1305 16
|
6月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
125 0
|
8月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
237 30
|
8月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
380 25
|
9月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
305 16
|
9月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
385 5
|
10月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
11月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
329 5

热门文章

最新文章