当前位置:   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博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/77729
推荐阅读
相关标签
  

闽ICP备14008679号