题解 | #牛群的重新分组#

牛群的重新分组

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题目,

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务