题解 | #牛群的重新分组#
牛群的重新分组
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个节点;