题解 | #链表中的节点每k个一组翻转#

二分查找-I

http://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

/**

  • struct ListNode {
  • int val;
  • struct ListNode *next;
  • }; */

class Solution { public: /** * * @param head ListNode类 * @param k int整型 * @return ListNode类 / ListNode reverseKGroup(ListNode* head, int k) { // write code here ListNode* tmp = head;//特别有用的一个中转节点 ListNode*s=NULL;

    ListNode*pHead = head;
    ListNode*pend = NULL;
    ListNode*pende = head;
    
    ListNode*nex = NULL;
    ListNode*pre = NULL;
    int n = 0;
    while(tmp)
    {
        tmp = tmp->next;
        n++;
    }
    tmp = head;
    if(k>n||(k ==1))
    {
        s = head;
    }
    else 
    {
        n = n-k;            //这里的不能这么简单赋值
        for(int i =0;i<k-1;++i)//注意这里不要循环太多次了
        {
            s = tmp->next;
            tmp = tmp->next;
        }
        tmp = head;
        for(int i =0 ;i<k-1;++i)
        {
            pend = tmp->next;
            tmp = tmp->next;
        }
        tmp = head;
         for(int i =0 ;i<k;++i)
        {
            pende = tmp->next;
            tmp = tmp->next;
        }
        if(n>=k)//考虑到反转后第一个节点的指向要后移动很多位
        {
            tmp  = pende;  //这里需要设置一个tmp,要步后面的循环就不对
          for(int  i =0;i<k-1;i++)//考虑到反转后第一个节点的指向要后移动很多位
          {
             pre = tmp->next;
             tmp=tmp->next;
          }
        }
        //如果只是反转一次,那么就可以不用后移动很多位
        else{
                pre = pende;
        }
        while(pHead!=pende)//这里不应该是设置pende,这里还是根据区间来定
        {
            nex = pHead->next;
            pHead->next = pre;
            pre = pHead;
            pHead = nex;
        }
        n = n-k;
        while(n>=0)
        {
           //设置第二次反转开始的头节点
           pHead = pende;
         for(int i =0 ;i<k;++i)//设置要反转到后一个节点
        {
            pende = pende->next;
        }
         if(n>=k)//考虑到反转后第一个节点的指向要后移动很多位
        {
             tmp = pende;
          for(int  i =0;i<k-1;i++)//考虑到反转后第一个节点的指向要后移动很多位
          {
              
             pre = tmp->next;
             tmp =tmp->next;
          }
        }
        //如果只是反转一次,那么就可以不用后移动很多位
        else{
                pre = pende;
        }
        while(pHead!=pende)
        {
            nex = pHead->next;
            pHead->next = pre;
            pre = pHead;
            pHead = nex;
        }
            n = n-k;
        }
    }
    return s;
}

};

全部评论

相关推荐

10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
Hesaki:没有面试官邀请就是这个状态
投递腾讯等公司10个岗位
点赞 评论 收藏
分享
酷酷的喜马拉雅山:感觉这比一直在初筛不动的好多了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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