/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     *   注意m==n, 和m,n为起始和结束两个节点时的返回的表头的特殊情况
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        ListNode *cur, *prev, *next, *m_node, *n_node, *m_prev_node, *n_next_node;
        int cnt = 1;

        cur = head;
        prev = NULL;
        if (m==n) return head;
        for (cnt = 1; cnt < n && cur != NULL; cnt++) {
            if (cnt < m) {
                prev = cur;
                cur = cur->next;
                continue;
            }
            if (cnt == m) {
                m_prev_node = prev;
                m_node = cur;
                prev = cur;
                cur = cur->next;
                continue;
            }
            next = cur->next;
            cur->next = prev;
            prev = cur;
            cur = next;
        }
        if (cnt == n && cur != NULL) {
            n_node = cur;
            n_next_node = cur->next;
            n_node->next = prev;
            if (m_prev_node != NULL) {
                m_prev_node->next = n_node;
            }
            m_node->next = n_next_node;
        }
        if (m_prev_node != NULL) {
            return head;
        } else {
            return n_node;
        }
    }
};