https://leetcode-cn.com/problems/reverse-linked-list-ii/

点击查看【bilibili】

题目

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

示例

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

解答

image.png
image.png

答案

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @param {number} m
  11. * @param {number} n
  12. * @return {ListNode}
  13. */
  14. var reverseBetween = function(head, m, n) {
  15. let prev = null
  16. let curr = head
  17. // 移动需要反转的指针
  18. for(let i=1;i<m;i++) {
  19. prev = curr
  20. curr = curr.next
  21. }
  22. // 标记指针
  23. let prev2 = prev
  24. let curr2 = curr
  25. // 遍历m到n的节点进行反转
  26. for(let i=m;i<=n;i++) {
  27. // next = curr.next
  28. // curr.next = prev
  29. // prev = curr
  30. // curr = next
  31. [curr.next, prev, curr] = [prev, curr, curr.next]
  32. }
  33. // m > 1,反转开始节点在链表中间
  34. if(prev2 !== null) {
  35. prev2.next = prev
  36. // 反转开始节点在链表开头
  37. }else {
  38. head = prev
  39. }
  40. curr2.next = curr
  41. return head
  42. };