/**
* 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;
}
}
};