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

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

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

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

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */     
  //链表翻转
    void reverseList(ListNode* node, int k)
    {
      
        ListNode *pre = node;
        ListNode *cur = node->next;
        ListNode *temp = cur->next;
        for (int i = 1; i < k; i++) {
            ListNode* temp = cur->next;     
            cur->next = temp->next;
            temp->next = pre->next;
            pre->next = temp;
        }
    }
    
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        // 将两个指针进行偏移然后翻转
        if(!head) return head;
        ListNode* vhead = new ListNode(-1);
        vhead->next = head;
        ListNode *pre = vhead;
        ListNode* p = head;
        
        //计算列表长度
        int n = 0;
        while(p) {
            p = p->next;
            n++;
        }
        
        //翻转区间个数
        int i = n/k;
        
        if(i == 0) return vhead->next;
        //先翻转k个点,之后再进行将点往后移k个点,继续进行翻转k个点。
        while(i--) {
            reverseList(pre, k);
            for(int z = 0; z < k; z++) pre = pre->next;
        }
        return vhead->next;
    }
};
全部评论

相关推荐

菜鸡29号:根据已有信息能初步得出以下几点: 1、硕士排了大本和大专 2、要求会多语言要么是招人很挑剔要么就是干的活杂 3、给出校招薪资范围过于巨大,说明里面的薪资制度(包括涨薪)可能有大坑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务