categories: [Blog,Algorithm]


92. 反转链表 II

难度中等690
反转从位置 mn 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ mn ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4。
输出: 1->4->3->2->5->NULL。
todo

  1. public ListNode reverseBetween(ListNode head, int m, int n) {
  2. ListNode dmy = new ListNode(0);
  3. dmy.next = head;
  4. int delta = n-m;
  5. ListNode pre = dmy,tail = head;
  6. //先定位出m节点和m之前的节点
  7. while(m>1){
  8. pre = tail;
  9. tail = tail.next;
  10. m--;
  11. }
  12. while(delta > 0){
  13. ListNode next = tail.next;
  14. tail.next = next.next;//tail一直不变,只要修改指针到next.next
  15. next.next = pre.next;//next.next指向pre的next,也就是最新的第m个位置
  16. pre.next = next;//更新next为最新的第m个位置
  17. delta --;
  18. }
  19. return dmy.next;
  20. }

todo

  1. //3段合并
  2. public ListNode reverseBetween1(ListNode head, int m, int n) {
  3. if (head == null || m == n) {
  4. return head;
  5. }
  6. ListNode guard = new ListNode(-1);
  7. guard.next = head;
  8. ListNode temp = guard;
  9. ListNode prev = guard;
  10. ListNode newNode = null;
  11. ListNode tail = null;
  12. int index = 0;
  13. while (temp != null && index <= n) {
  14. ListNode tempNext = temp.next;
  15. if (index < m) {
  16. prev = temp;
  17. }
  18. if (index == m) {
  19. tail = temp;
  20. }
  21. if (index >= m) {
  22. temp.next = newNode;
  23. newNode = temp;
  24. }
  25. index++;
  26. temp = tempNext;
  27. }
  28. tail.next = temp;
  29. prev.next = newNode;
  30. return guard.next;
  31. }