题解 | #牛群的重新分组#
牛群的重新分组
https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93
考察知识点:链表,指针
题目分析:
1、首先遍历出k倍数以内的链表成员的地址,并保存早list head中
2、当检测到当前lits head中累积到的数量已经达到了k的数量,就把list head的地址倒序写入到new_head链表中
3、重复1和2的步骤,知道找到链表的最后一个成员
4、吧链表中最后的一组保存到list head链表成员(通常这个list head的长度大于等于0,且一定小于k)循环写入到new_head的末尾,并将new_head的最后一个链表成员的next赋值为空,防止无意义 的链表循环
采用的编码语言:C
完整的编码代码:如下所示
/** * struct ListNode { * int val; * struct ListNode *next; * }; */ /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ struct ListNode* reverseKGroup(struct ListNode* head, int k ) { struct ListNode *new_head = NULL; struct ListNode *tmp_head1 = NULL, *tmp_head2 = NULL; struct ListNode *head_list[5000] = {0}; int list_cout = 0; tmp_head1 = head; /* 遍历整个链表 */ while (1) { head_list[list_cout++] = tmp_head1; // 将当前链表成员的地址缓存起来 tmp_head1 = tmp_head1->next; // 更新tmp head1为下一个链表的地址 if (list_cout % k == 0) { // 求余为0表示当前的值是k的整数倍 for (int i = (list_cout - 1); i >= 0; i--) { // 通过遍历已经存储的head list,将其重新重组为新的链表 if (new_head == NULL) { // 新的链表需要一个链表头,第一次赋值的成员就是链表头,并更新tmp head2的地址为新链表头的地址 new_head = head_list[i]; tmp_head2 = head_list[i]; } else { tmp_head2->next = head_list[i]; // 刷新tmp list2指向的下一个链表成员的地址 tmp_head2 = head_list[i]; // 刷新tmp list2的地址为下一个链表成员的地址 } } list_cout = 0; //将缓存的链表数组更新为0 } if (tmp_head1 == NULL) { // 当下一个链表的地址为NULL时,表示已经遍历到了链表末尾 for (int i = 0; i < list_cout; i++) { // 将链表最后几个不足k倍数的链表成员循序写入新链表 if (new_head == NULL) { // 防止k值大于链表长度时,没有初始化新的链表头 new_head = head_list[i]; tmp_head2 = head_list[i]; } else { // 把没有更新的最后几个链表成员循序更新如新链表中 tmp_head2->next = head_list[i]; tmp_head2 = head_list[i]; } } tmp_head2->next = NULL; // 把最后一个链表成员的下一个成员地址赋值为 null,防止出现无意义的循环 break; } } return new_head; }
面试高频TOP202解析 文章被收录于专栏
采用Java,C,Python等方法去解答面试高频TOP202题目,