Reverse K Groups
这道题目也是面试出现频率极高的linklist和BT之一,我已开始没完全想清楚大的逻辑框架就开始写,导致很多修改,就像拿到作文题,审题即使
5min也不为过,一定要把大的框架想清楚。
linklist题处理head是必不可少的,而这里还会出现最后尾部结点不够,要么每次都遍历一遍,这样时间效率太低,可能TLE,因此如果尾部不够了
就在reverse回去。因此大致的框架是
while(1)
{
if(process head)//kprev is null
{
//similar to general, but modify head, and not use kprev
}
else//general, that is kprev has been assigned
{
while()//reverse
{
}
if()//left nodes not enough, reverse back, return
{
...
break;
}
else//append before and after linklist
{
}
}
}
但是细节处指针非常繁琐,尤其不能断链,注意while结束发现不止两种情况,因为while是有i<=k p!=NULL两个情况,当两个都不满足的时候
又是另一种情况 ,不能与前面的合并,单单i>k 前后linklist连起来, 单单p==NULL 遍历结束 前后链接,return
代码如下,可能用冗余,但是还是遵从代码优化是万恶的源头,注意不是算法的优化,代码不优化不影响执行效率:
ListNode *reverseKGroup(ListNode *head, int k)
{
if(head==NULL ||head->next==NULL || k<=1) return head;
int i;
ListNode* kprev=NULL, *p=head, *pnext,*prev,*newkprev,*koldhead;
while(1)
{
if(kprev!=NULL)
{
i=1;
prev=NULL;
koldhead=p;
while(p!=NULL && i<=k)//reverse
{
pnext=p->next;
p->next=prev;
prev=p;
p=pnext;
i++;
}
if(p==NULL && i<=k)//at last not k nodes
{
p=prev;//prev is last node
prev=NULL;//last node's next is null
while(p!=NULL)//sure last reverse prev initial is null
{
pnext=p->next;
p->next=prev;
prev=p;
p=pnext;
}
kprev->next=prev;//prev is now less than k tuple initial head
break;
}
else if(p!=NULL && i>k)
{
//newkprev=kprev->next;
koldhead->next=p;//1 to k+1
kprev->next=prev;//0 to k
kprev=koldhead;
}
else if(p==NULL && i>k)
{
kprev->next=prev;
break;
}
}
else//kprev is no NULL
{
i=1;
prev=NULL;
koldhead=p;
while(p!=NULL && i<=k)//reverse
{
pnext=p->next;
p->next=prev;
prev=p;
p=pnext;
i++;
}
if(p==NULL && i<=k)//at last not k nodes
{
p=prev;
prev=NULL;
while(p!=NULL)//sure last reverse prev initial is null
{
pnext=p->next;
p->next=prev;
prev=p;
p=pnext;
}
break;
}
else if(p!=NULL && i>k)
{
kprev=head;
head=prev;
kprev->next=p;
}
else if(p==NULL && i>k)
{
head=prev;
break;
}
}
}
return head;
}