链表结点每k个翻转一次

链表中的节点每k个一组翻转

http://www.nowcoder.com/questionTerminal/b49c3dc907814e9bbfa8437c251b028e

这道题也是链表的翻转,每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;
    }
};



全部评论

相关推荐

迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务