关键点: 1、时间复杂度为O(1),所以只能遍历1次链表; 2、注意边界,m和n为链表开头和结尾时,返回值(表示反转后的链表头)应该是哪个;
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
// write code here
ListNode *start = nullptr, *end = nullptr, *start_prev = nullptr, *cur = nullptr, *prev = nullptr, *next = nullptr;
int i = 0;
prev = head;
for (i = 0, cur = head; i < n && cur != nullptr; i++, cur = next) {
next = cur->next;
if (i < m - 1) {
//if (i == m - 2) {
// start_prev = cur;
//}
prev = cur;
continue;
}
if ( i == m - 1) {
start = cur;
start_prev = prev;
prev = cur;
continue;
}
cur->next = prev;
prev = cur;
}
if ( i < n) {
return NULL;
}
end = prev;
if (start_prev != start) {
start_prev->next = end;
start->next = cur;
return head;
} else {
start->next = cur;
return end;
}
}
};