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;
}

Posted by richard爱闹 - 8月 1 2014
如需转载,请注明: 本文来自 Richard