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

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务