题解 | #链表内指定区间反转#
链表内指定区间反转
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;
}
};
#牛客创作赏金赛#牛客网刷题记录 文章被收录于专栏
本人认为值得记录的一些题