题解 | #牛群的重新分组#

牛群的重新分组

https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93

解题思路:

主要利用递归的思想,也就是说把每个片段(K划分)重复反转:

1,找出要反转的片段,以确认每片段反转的结束;

2,按照正常的链表翻转流程,把链表翻转;

3,利用递归的思想来完成下一个片段的翻转,在翻转前需要完成链表的拼接。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        if(k == 0){
            return head;
        }
        ListNode* pre = nullptr;
        ListNode* CutStart = head;
        ListNode* CutEnd = nullptr;
        ListNode* Aux = head;
        for(int i = 0; i < k; i++){
            // 这里的判断条件要前置,
            //以防止全翻转时直接返回head也就是对原来链表不做为
            if(Aux == nullptr){
                return head;
            }
            Aux = Aux->next; // 找到翻转片段的尾部
        }
        // 按照正常翻转进行链表的翻转
        while(CutStart != Aux){
            ListNode* tempNode = CutStart ->next;
            CutStart->next = pre;
            pre = CutStart;
            CutStart = tempNode;
        }
        // 接着需要进行链表片段的拼接
        // 这里需要注意的是:虽然反转了,但是原来的头还是头
        CutEnd = head;
        head = pre;
        // CutEnd的下一个本来是空,所以这个递归要注意
        CutEnd->next = reverseKGroup(Aux, k);
        return head;
    }
};
全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务