题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
链表头插法和链表翻转
- 头插法
- 链表翻转
用例:
{1,2} ,3
不满K个元素时候直接原序返回,如果满足k个元素的时候,就要倒序返回,
因此 每k个元素作为一个链表,遍历的时候 要翻转过来,可以用头插法实现
剩下不足k个元素 由于要翻转过来,那么再翻转一次即可。
/** * 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) { if (!head || !head->next || k <= 1) return head; // write code here ListNode H(0); int cnt = 0; ListNode* p = &H; ListNode* tmp = NULL; while (head) { auto t = head->next; head->next = NULL; cnt++; tmp = insert(tmp, head); head = t; if (cnt % k == 0) { p->next = tmp; tmp = NULL; while (p && p->next) p = p->next; } } p->next = rev(tmp); return H.next; } ListNode* insert(ListNode* a, ListNode* b) { b->next = a; return b; } ListNode* rev(ListNode* p) { ListNode* pre = NULL; ListNode* next = NULL; while (p) { next = p->next; p->next = pre; pre = p; p = next; } return pre; } }; #ifdef debug int main() { cout << " * " << endl; Solution k; auto arr = {1, 2, 3, 3, 5}; println ( k.reverseKGroup(makelist({1, 2}), 3) ); return 0; } #endif
算法常用解题技巧 文章被收录于专栏
算法常用解题技巧