1. 题目描述

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:1 ≤ m ≤ n ≤ 链表长度。

示例:

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

2. 解题思路

这个题最主要的就是将第m到n的节点进行饭反转,然后将m-1节点指向n,让n+1节点指向m,这样就实现了链表的局部反转。

3. 代码实现

  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. // 定义虚拟头结点
  16. let dummy = new ListNode()
  17. dummy.next = head
  18. // 寻找第m-1节点
  19. let p = dummy
  20. for(let i =0; i<m-1; i++){
  21. p= p.next
  22. }
  23. // 定义当前节点和前驱节点,当前节点指向m节点
  24. let pre = null
  25. let cur = p.next
  26. // 将m到n的节点进行反转
  27. for(let i = 0; i<= n-m; i++){
  28. let next = cur.next
  29. cur.next = pre
  30. pre = cur
  31. cur = next
  32. }
  33. // 将反转的局部链表和原链表进行拼接
  34. p.next.next = cur
  35. p.next = pre
  36. return dummy.next
  37. };

4. 提交结果

92. 反转链表 II - 图1