当前位置:   article > 正文

【算法题】92. 反转链表 II

【算法题】92. 反转链表 II

题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

链表中节点数目为 n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
 

进阶: 你可以使用一趟扫描完成反转吗?

题解

  1. class Solution {
  2. public ListNode reverseBetween(ListNode head, int left, int right) {
  3. // 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论
  4. ListNode dummyNode = new ListNode(-1);
  5. dummyNode.next = head;
  6. ListNode pre = dummyNode;
  7. // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
  8. // 建议写在 for 循环里,语义清晰
  9. for (int i = 0; i < left - 1; i++) {
  10. pre = pre.next;
  11. }
  12. // 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
  13. ListNode rightNode = pre;
  14. for (int i = 0; i < right - left + 1; i++) {
  15. rightNode = rightNode.next;
  16. }
  17. // 第 3 步:切断出一个子链表(截取链表)
  18. ListNode leftNode = pre.next;
  19. ListNode curr = rightNode.next;
  20. // 注意:切断链接
  21. pre.next = null;
  22. rightNode.next = null;
  23. // 第 4 步:同第 206 题,反转链表的子区间
  24. reverseLinkedList(leftNode);
  25. // 第 5 步:接回到原来的链表中
  26. pre.next = rightNode;
  27. leftNode.next = curr;
  28. return dummyNode.next;
  29. }
  30. private void reverseLinkedList(ListNode head) {
  31. // 也可以使用递归反转一个链表
  32. ListNode pre = null;
  33. ListNode cur = head;
  34. while (cur != null) {
  35. ListNode next = cur.next;
  36. cur.next = pre;
  37. pre = cur;
  38. cur = next;
  39. }
  40. }
  41. }

来自力扣官方题解

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  • 滤波实际上是信号处理的一个概念,图像可以看成一个二维信号,其中像素点灰度值得高低代表信号的强弱高频:图像中变化剧烈的部分低频︰图像中变化缓慢,平坦的部分根据图像高低频特性,设置高通和低通滤波器。高通滤波可以检测图像中尖锐、变化明显的地方﹐低... [详细]

  • 虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!目录①是什么?②为什么要在频... [详细]

  • 人工神经网络简介_人工神经网络人工神经网络   本文主要对人工神经网络基础进行了描述,主要包括人工神经网络的概念、发展、特点、结构、模型。   本文是个科普文,来自网络资料的整理。... [详细]

  • List接口java.util.List接口继承Collection接口,是集合一个重要分支,我们平常所使用最多就是这个集合,我们用实现类所实现这个接口时候,习惯把这个接口对象叫做List集合List接口List集合特点:1、它... [详细]

  • 1.数组与集合1.1集合与数组存储数据概述:集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 说明:此时的存储:主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中)1.2数组存储的特点:一... [详细]

  • 你可以根据实际需要,将上述代码添加到微信程序的对应页面中,并在列表的内容部分添加自己的内容。这样,就可以实现折叠不同的两个列表的功能。属性来控制列表的显示和隐藏。这两个数据属性控制。初始时,这两个属性的值都是。要实现在微信程序中的折叠功... [详细]

  • better-scroll插件用于移动端开发,让滚动更加丝滑1.安装npminstall--savebetter-scroll@1.15.22.封装封装成一个组件,方便复用,代码如下