链表-K组翻转链表-困难

描述

给你一个链表以及一个k,将这个链表从头指针开始每k个翻转一下。
链表元素个数不是k的倍数,最后剩余的不用翻转。

您在真实的面试中是否遇到过这个题?  是

样例

给出链表 1->2->3->4->5

k = 2, 返回 2->1->4->3->5

k = 3, 返回 3->2->1->4->5

题目链接

程序



/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param head: a ListNode
     * @param k: An integer
     * @return: a ListNode
     */
    ListNode *reverse(ListNode *p1, ListNode *p2){
        ListNode *p1next = p1->next;//刚开始有一个dummpy节点
        ListNode *p2next = p2->next;
        ListNode *prev = p2next;
        ListNode *p = p1next;
        //p1指向p2,整个链表段翻转
        while(p != p2next){
            ListNode *temp = p->next;
            p->next = prev;
            prev = p;
            p = temp;
        }
        p1->next = p2;//翻转前的节点指向新节点p2(p2是被翻转后)
        return p1next;//返回翻转后的尾节点,即翻转前的头结点
    }
    
    ListNode * reverseKGroup(ListNode * head, int k) {
        // write your code here
        //k为1的时候,直接返回
        if(k == 1)
            return head;
        ListNode *dummpy = new ListNode(0);
        dummpy->next = head;
        //p1为头,p2为尾
        ListNode *p1 = dummpy, *p2 = dummpy;
        //找到p2的k个尾部,如果出现null,直接返回head
        for(int i = 0; i < k; i++){
            if(p2 == NULL)
                break;
            p2 = p2->next;
        }
        if(p2 == NULL)
            return head;
        
        while(p2 != NULL){
            p2 = reverse(p1, p2);//p1为头,p2为尾
            for(int i = 0; i < k; i++){
                if(p2 == NULL)
                    break;
                p1 = p1->next;
                p2 = p2->next;
            }
        }
        return dummpy->next;
    }
};


猜你喜欢

转载自blog.csdn.net/qq_18124075/article/details/81075048