题解 | 链表中的节点每k个一组翻转
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e?tpId=196&tqId=37080&rp=1&sourceUrl=%2Fexam%2Foj%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=3&judgeStatus=undefined&tags=580&title=
/** * 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* reverseONE(ListNode* headone, int k){ //反转链表,增加处理头尾节点的部分 ListNode* curr = headone->next; ListNode* prev = nullptr; ListNode* tail = headone->next; //记录这组新的尾 while(k--){ ListNode* temp = curr->next; curr->next = prev; prev = curr; curr = temp; } tail->next = curr; //把新的尾连接到下一组的头; headone->next = prev; //把上一组的尾连接到这组的头; return headone = tail; } ListNode* reverseKGroup(ListNode* head, int k) { //主函数 ListNode* node = head; int nums = 0; while(node){ //统计有多少个节点 ++nums; node = node->next; } int groupnums = nums/k; //计算多少组 ListNode dummy(0); //头结点处理 dummy.next = head; node = &dummy; for(int i=1; i <=groupnums; i++){ //每组处理 node = reverseONE(node, k); //返回时更新下一组的头 } return dummy.next; } };