题解 | #牛群的重新分组#
牛群的重新分组
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题目,
查看7道真题和解析
