class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode *dummy=nullptr; ListNode *h = head; for(int i=1; i<m; i++) { dummy = head; head = head->next; } ListNode *start = head; int revLen = n-m; for(int i=0; i<revLen; i++) { head = head->next; } ListNode *end = head->next; head->next = nullptr; ListNode *newHead = reverse(start); if(dummy == nullptr) { h = newHead; } else { dummy->next = newHead; } head = newHead; while(head->next != nullptr) { head = head->next; } head->next = end; return h; } ListNode* reverse(ListNode* head) { if(head == nullptr) return head; ListNode* dummy = head; ListNode* left = head; ListNode* right = head->next; while(right != nullptr) { ListNode* next = right->next; right->next = left; left = right; right = next; } dummy->next = nullptr; return left; } };
借用上一题反转列表的逻辑,先找到要反转的区间,并标记好区间边界的链表节点,反转结束之后再接上即可。注意边界条件的处理