题解 | #链表内指定区间反转#
链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c
/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : val(x), next(nullptr) {} * }; */ 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 if(head==nullptr) // 防止为空链表 return head; if(m==n) // 如果m==n 则说明为无效反转 return head; // 两个指针 p指针指向第m个元素,pre指针指向p的前驱 // 注意:若从第一个元素开始反转,则pre==nullptr ListNode* p = head; ListNode* pre=nullptr; for(int i=1;i<m;i++) { pre=p; p=p->next; } // end 指针表示反转结束后的第n个结点,需要将其重新链入链表中。 ListNode* end =nullptr; // 让p指针往后移动一下,从m+1的位置开始反转 p=p->next; // count表示当前反转完几个结点 int count=1; if(pre == nullptr) // 表示从第一个结点开始反转,需要特殊处理,即更新head { end = head; // head即为反转结束的第n个结点 while(count + m <= n) { ListNode* t = p->next; p->next = head; head=p; p=t; count++; } } else { end = pre->next; while(count + m <= n) { ListNode* t = p->next; p->next = pre->next; pre->next = p; p = t; count++; } } // 将反转后的重新链入链表中 end ->next = p; return head; } };#牛客创作赏金赛#
牛客网刷题记录 文章被收录于专栏
本人认为值得记录的一些题