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

牛群的重新分组

https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93

/**
 * 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 dummy;
    dummy.next = head;
    struct ListNode* prev = &dummy, *curr = head;
    int count = 0;

    // Count the number of nodes in the list
    while (head) {
        count++;
        head = head->next;
    }

    while (count >= k) {
        struct ListNode* start = prev->next;
        struct ListNode* nex = curr->next;

        for (int i = 1; i < k; i++) {
            curr->next = nex->next;
            nex->next = prev->next;
            prev->next = nex;
            nex = curr->next;
        }

        prev = start;
        curr = start->next;
        count -= k;
    }

    return dummy.next;
}

长度为n的链表反转就是:

    让当前第二个节点排在当前第一个节点前面;

    让当前第三个节点排在当前第一个节点前面;

    ......

    一直把n个都排完

例如:

    12345

    21345

    32145

    43215

    54321

每次需要操作的有三个节点:

    当前第n个节点:第n个节点的next指向第一个节点;

    当前第1个节点:因为每次第1个节点都在变,所以声明头节点;

    当前第n-1个节点:第n-1个节点指向第n+1个节点;

全部评论

相关推荐

入职华为的第一步:投递
投递华为技术有限公司等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-29 14:02
纠结的茶叶蛋在开会:太简单了,技术和业务没一个够用的,要么学业务,去搞erp或者his,要么专精技术,去搞架构
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务