题解 | #链表内指定区间反转#
链表内指定区间反转
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) {
//抽书法交换位置
//int抽书的次数
int s=n-m;
if(head==nullptr||n==m){//当m=n时返回头节点
return head;
}
//定义一个虚拟节点让它一直指向头节点
ListNode* dummy=new ListNode(0);
//2. new ListNode(0):new是C++中的动态内存分配操作符,表示在堆(heap)上分配内存,并创建一个新的ListNode对象。ListNode(0)表示调用ListNode结构体的构造函数,用值0初始化节点的val,即该节点的值为0,并且默认构造函数会将next指针初始化为nullptr。
dummy->next=head;
//创建per节点在头节点前面
ListNode* per=dummy;
//找到开始反转的前一位置和反转位置和反转的下一位置
for(int i=1;i<m;i++){
per=per->next;
}
//创建当前节点
ListNode* cur=per->next;
//创建当前的下一个节点
ListNode* nex;
for(int i=0;i<n-m;i++){
//nex要每次都是cur的下一个
nex=cur->next;
//当前节点指向后一个节点的后一个节点
cur->next=nex->next;
//后一节点指向per的后一节点
nex->next=per->next;
//per指向nex节点
per->next=nex;
}
return dummy->next;
}
};
