题解 | #牛群的重新分组#
牛群的重新分组
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; } };