【数据结构算法篇】链表面试必刷题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

相关文章
|
9月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
8月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
380 1
|
8月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
210 0
|
12月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
370 10
 算法系列之数据结构-二叉树
|
12月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
365 3
 算法系列之数据结构-Huffman树
|
12月前
|
算法
面试场景题:如何设计一个抢红包随机算法
本文详细解析了抢红包随机算法的设计与实现,涵盖三种解法:随机分配法、二倍均值法和线段切割法。随机分配法通过逐次随机分配金额确保总额不变,但易导致两极分化;二倍均值法优化了金额分布,使每次抢到的金额更均衡;线段切割法则将总金额视为线段,通过随机切割点生成子金额,手气最佳金额可能更高。代码示例清晰,结果对比直观,为面试中类似算法题提供了全面思路。
1822 16
|
12月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
501 22
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
451 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
637 25
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
793 23

热门文章

最新文章