struct ListNode *reverseBefore(struct ListNode *head, int n) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* prev = head;
struct ListNode *current = head->next;
for (int i = 0; i < n && current != NULL; i++) {
struct ListNode * next = current ->next;
current->next = prev;
prev = current;
current = next;
}
head->next = current;
return prev;
}
struct ListNode *reverseBetween(struct ListNode *head, int m, int n) {
struct ListNode *beforeM = head;
for (int i = 1; i < m - 1; i++) {
beforeM = beforeM->next;
}
if (m == 1) {
return reverseBefore(beforeM, n-m);
}
beforeM->next = reverseBefore(beforeM->next, n - m);
return head;
}
|