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

牛群的重新分组

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个节点;

全部评论

相关推荐

2024-11-08 10:39
门头沟学院 C++
点赞 评论 收藏
分享
2024-11-05 21:41
西安电子科技大学 C++
杂粮饼加肉松辣条:什么时候HR面的呀
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务