当前位置:   article > 正文

LeetCode 92 | 大公司常考的面试题,翻转链表当中指定部分

leetcode 92

今天是LeetCode专题的第58篇文章,我们一起来看看LeetCode 92题,翻转链表II(Reverse LInked List II)。

这题的官方难度是Medium,2451个赞同,145个反对,通过率38.6%。从这份数据上我们也看得出来,这题的质量很高,广受好评。也的确如此,这是一道非常经典的链表问题,不仅考验我们对于链表的理解和掌握,而且对基本功的要求也很高。


题意


给定一个链表和两个整数m和n,m和n分别代表链表当中的第m和第n个元素,其中m <= n。要求我们通过一次遍历将链表当中m到n这一段元素进行翻转


样例

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
  • 1
  • 2

题解


这题的题意很直接,就是让我们翻转链表当中指定的部分,并且只能通过一次遍历完成。

我们很容易想明白,通过m和n我们可以将链表分成三个部分:

分别是m左侧的,m到n之间的也就是我们需要翻转的部分,以及n右侧的部分。当然这里可能存在一个特殊情况,m左侧和n的右侧都有可能没有元素,我们可以先忽略,先考虑最一般的情况。

翻转链表我们最常用的方法就是先把[m, n]区间里的元素先存储起来,人工翻转了之后,再重新构建成一段链表,替换原链表对应的部分。但是很明显也可以发现,这样做是不符合题目要求的。因为我们存储元素遍历了链表一次,我们在构建链表的时候又遍历了一次,至少需要两次遍历才可以完成

那怎么样才能一次遍历完成链表的翻转呢?其实也很简单,我们只需要倒叙插入就好了。

比如我们有这样一段链表,我们想要翻转其中2、3、4这三个节点:

首先,我们从1开始,1是翻转之后的起始部分。我们先记录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/209558
推荐阅读
相关标签
  

闽ICP备14008679号