1. 概述

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

说明:

1 ≤ m ≤ n ≤ 链表长度。

示例:

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

输出: 1->4->3->2->5->NULL

1.1 思路

  1. 把链表分成三部分,前后不变中间反转,再将三部分合并成一个新的链表。

    2. 解题

    ```php <?php

class ListNode { public $val = 0; /* @var ListNode / public $next = null;

  1. function __construct($val)
  2. {
  3. $this->val = $val;
  4. }

}

class Solution { /**

  1. * @param ListNode $head
  2. * @param Integer $m
  3. * @param Integer $n
  4. * @return ListNode
  5. */
  6. public function reverseBetween($head, $m, $n) :? ListNode
  7. {
  8. $dummy = new ListNode(0);
  9. $dummy->next = $head;
  10. /** @var ListNode $newDummy */
  11. $newDummy = NULL;
  12. /** @var ListNode $newHead */
  13. /** @var ListNode $newMiddleTail */
  14. /** @var ListNode $newMiddle */
  15. $newHead = $newMiddleTail = $newMiddle = NULL;
  16. $i = 0;
  17. while ($dummy->next) {
  18. $i++;
  19. if ($i < $m) {
  20. // 组成新链表
  21. if ($newHead) {
  22. $newHead->next = new ListNode($dummy->next->val);
  23. } else {
  24. $newHead = new ListNode($dummy->next->val);
  25. }
  26. $dummy = $dummy->next;
  27. continue;
  28. }
  29. if ($i > $n) break;
  30. // 删除中间元素
  31. $tmpNode = $dummy->next;
  32. $dummy->next = $dummy->next->next;
  33. // 创建 “新中间元素链表” :取迭代元素插入 $newMiddle 头部
  34. $newMiddle && $tmpNode->next = $newMiddle;
  35. $newMiddle = $tmpNode;
  36. // 记录 “新中间元素链表” 尾部
  37. !$newMiddleTail && $newMiddleTail = $tmpNode;
  38. // 绑定尾部指针后边链表元素
  39. if ($i == $n) {
  40. $newMiddleTail->next = $dummy->next;
  41. }
  42. }
  43. // 新链表前部 与 新中间元素链表 合并
  44. if ($newMiddle) {
  45. $newHead->next = $newMiddle;
  46. } else {
  47. $newHead = $newMiddle;
  48. }
  49. return $newHead;
  50. }

}

// 1->2->3->4->5 // 1->4->3->2->5 $head = new ListNode(1); $head->next = new ListNode(2); $head->next->next = new ListNode(3); $head->next->next->next = new ListNode(4); $head->next->next->next->next = new ListNode(5); $m = 2; $n = 4;

$cls = new Solution(); $ret = $cls->reverseBetween($head, $m, $n); print_r($ret); ```