来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/

描述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

题解

使用了四个指针,请君慢慢咀嚼~

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode reverseBetween(ListNode head, int m, int n) {
  11. if (null == head) return null;
  12. ListNode cur = head, prev = null;
  13. while (m > 1) {
  14. prev = cur;
  15. cur = cur.next;
  16. m--;
  17. n--;
  18. }
  19. ListNode con = prev, tail = cur;
  20. ListNode third = null;
  21. while (n > 0) {
  22. third = cur.next;
  23. cur.next = prev;
  24. prev = cur;
  25. cur = third;
  26. n--;
  27. }
  28. if (con != null) {
  29. con.next = prev;
  30. } else {
  31. head = prev;
  32. }
  33. tail.next = cur;
  34. return head;
  35. }
  36. }

复杂度分析

  • 时间复杂度: 92. 反转链表 II(Reverse Linked List II) - 图1
  • 空间复杂度: 92. 反转链表 II(Reverse Linked List II) - 图2