本题思路是先定义区间时,找到区间的前一个结点并记录,然后在需要翻转的区间中,执行翻转程序,
程序思路:逐步翻转,一次翻转两个指针的指向,翻转的次数是n-m次,可以画图理解
(提示:本代码可以选择是否加上对于NULL的判断,防止访问NULL的next,实际上n,m的大小应该就会限制这种情况,看个人喜好是否加上)
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
if(head==NULL||head->next==NULL)
{
return head;
}
else
{
struct ListNode* New=(struct ListNode*)malloc(sizeof(struct ListNode));
New->next=head;//设置头结点是为了防止区域一开始就是第一个结点。
struct ListNode* prev,*cur,*tail;
prev=New;
for(int i=0;i<m-1;i++)
{
prev=prev->next;//这里得到交换区域前一个结点。
}
cur=prev->next;//将交换区的第一个结点给cur。
for(int j=0;j<n-m;j++)
{
tail=cur->next;
cur->next=tail->next;
tail->next=prev->next;
prev->next=tail;
}
return New->next;//返回New的next,因为New中多分配了一个结点,会导致输出有误。
}
}