这道题也是链表的翻转,每k个结点翻转一次,所以需要记录几个关键点:
如图所示,需要记录下每段第一个也就是翻转后的第k个节点,即在每一段中
中翻转后,我们需要保留有前一段的结束结点,这一段的开始结点,这一段的
结束结点位置。然后把他们关联起来就可以了。
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
//若k小于2,直接返回
if(k<2)
return head;
int i=1,cnt=1;
//pr1前一段结束位置节点
//pr2这一段结束位置节点
ListNode* left;
ListNode* pr1=NULL;
ListNode* pr2=NULL;
ListNode* output=head;
while(head)
{
if(i==1)
{
left=head;
pr2=left;
}
head=head->next;
i++;
cnt++;
//因为先head=head->next;,所以需要判断head,否则可能越界
if(head==NULL)
break;
if(cnt==k)
output=head;
//k长度翻转
if(i==k)
{
ListNode* right=head->next;
ListNode* mid=left->next;
left->next=right;
while(mid!=right)
{
ListNode* tmp=mid->next;
mid->next=left;
left=mid;
mid=tmp;
}
//更新pr1,pr1不存在那就是第一段k长度链表
if(pr1)
pr1->next=left;
pr1=pr2;
//更新head结点位置
head=right;
i=1;
}
}
//输出output,要么是原链表第一个结点,要么是第k个节点
return output;
}
}; 
京公网安备 11010502036488号