循环
- 考虑清楚链表头节点需不需要反转即可
- 做题时冷静,仔细画出几种可能:常规的,要逆转头结点,尾结点的情况
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(head==NULL) return NULL;
ListNode* new_pos = head;
ListNode *pre;
ListNode *start;
ListNode *cur;
bool flag = true;
if(m!=1) {
for (int i = m; i > 1 + 1; i--) new_pos = new_pos->next;
pre = new_pos;
start = new_pos;
cur = new_pos->next;
}
else{
flag = false;
pre = NULL;
cur = head;
}
ListNode* end = cur;
ListNode* next;
int t=n-m+1;
while(t){
t--;
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
if(flag) start->next = pre;
else head = pre;
end->next = cur;
return head;
}
};
递归
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(m==1){
return reverseN(head, n);
}
head->next = reverseBetween(head->next, m-1, n-1);
return head;
}
private:
ListNode* successor;
ListNode* reverseN(ListNode* head, int n){
if(n==1){
successor = head->next;
return head;
}
ListNode* last = reverseN(head->next, n-1);
head->next->next = head;
head->next = successor;
return last;
}
};