/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *dummyNode=new ListNode(0);//头结点太关键了,所有点都变为同类型相同处理。
dummyNode->next=head;
ListNode *pre=NULL;
ListNode *pre1=dummyNode;
ListNode *right=NULL;
int i=0,j=1;
ListNode *end=pre1;
//进行分段
while(i<m-1){
pre1=pre1->next;
i++;
}
ListNode *mid=pre1->next;
ListNode *p=mid;
while(j<(n-m+1)){
p=p->next;
j++;
}
if(p!=NULL)//若p为NULL,则不对right进行操作,
{
right=p->next;
p->next=NULL;//分段
}
pre1->next=NULL;//分段
//中间部分进行逆置
while(mid){
ListNode *tmp=mid->next;
mid->next=pre;
pre=mid;
mid=tmp;
}
//开始拼接
pre1->next=pre;
while(pre1->next!=NULL){
pre1=pre1->next;
}
pre1->next=right;
return end->next;//把第一个头结点去掉
}
};
题解 | #链表内指定区间反转#
最新推荐文章于 2025-05-21 15:08:20 发布