题解 | #链表中的节点每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;
}

};

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务