每天一道Code 25. K 个一组翻转链表

在这里插入图片描述
代码思路
K个一组翻转,那就想办法将K个节点放在一组。
定义三个指针:
locate定位要翻转的k节点个中最后一个,也就是翻转后的第一个。
now定位翻转后的最后一个也就是当前的第一个。
last定位的是这k个节点的前一个节点,方便插入操作。
这样的话通过这三个定位指针我们就可以轻松实现翻转。
详细的思路见代码注释。
手绘图预警!
在这里插入图片描述
通过结果还ok。
在这里插入图片描述

具体代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
    
    
public:
    ListNode* del(ListNode* pre){
    
    
        //删除pre的下一个节点并返回删除节点
        ListNode* node = pre->next;
        pre->next=node->next;
        node->next=NULL;
        return node;
    }
    ListNode* reverseKGroup(ListNode* head, int k) {
    
    
        //每k个一组翻转,通过指针定位,实现判断翻转完成及下一组的开始位置
        ListNode *dummy=new ListNode(-1);
        dummy->next=head;
        //locate定位要翻转的k节点个中最后一个,也就是翻转后的第一个。now定位翻转后的最后一个也就是当前的第一个,last定位的是这k个节点的前一个节点,方便插入操作。
        ListNode *locate=dummy,*last=dummy,*now=dummy->next;
        while(now){
    
    
            int x=0;
            while(x!=k){
    
        //找到locate该定位的位置
                locate=locate->next;
                x++;
                if(!locate) return dummy->next; //找到NULL,剩下的数不足k个,直接返回即可。
            }
            while(last->next!=locate){
    
              //翻转操作,将每个删除的节点放在locate后面
                ListNode *node = del(last);
                node->next=locate->next;
                locate->next=node;
            }
            locate=now;                         //更新这三个定位指针
            last=now;
            now=last->next;
        }
        return dummy->next;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41746268/article/details/108171244