92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given m, n satisfy the following condition:
1 ? m ? n ? length of list.

这道题是比较常见的链表反转操作,不过不是反转整个链表,而是从m到n的一部分。分为两个步骤,第一步是找到m结点所在位置,第二步就是进行反转直到n结点。反转的方法就是每读到一个结点,把它插入到m结点前面位置,然后m结点接到读到结点的下一个。总共只需要一次扫描,所以时间是O(n),只需要几个辅助指针,空间是O(1)。代码如下: 

1.reverse 需要这么几个节点:

第一段尾节点(m的前一个节点), 第二段首节点(初始化为第二段第一个节点)、第二段遍历的节点(初始化为第二段第二个节点)-->作为第三段的首

   mid                                   tail                                                                  mpointer  

节点、第二段尾节点(即第二段第一个节点)   ----npointer

2.dummyNode + m的前一个节点

public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode prev = new ListNode(-1);
        prev.next = head;
        ListNode mpointer = prev; //point to m-1 position
        ListNode npointer = prev; //point to n position
        int index = 1;
        while (index < m) {
            mpointer = mpointer.next;
            index++;
        }
       
        ListNode mid = mpointer;
        ListNode tail = mpointer.next;
        npointer = tail;
        mpointer = tail.next;
        //ListNode midHead = tail.next;
        while  (m < n) {
            ListNode temp = mpointer.next;
            mpointer.next = tail;
            tail = mpointer; 
            mpointer =  temp;
            m++;            
        }
        mid.next = tail;
        npointer.next =  mpointer;
        return prev.next;     
    }

  

原文地址:https://www.cnblogs.com/apanda009/p/7299696.html