题解 | #牛群的重新分组#
牛群的重新分组
https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93
知识点
链表,反转链表
解题思路
大致的思路是找出链表的总节点数n,分为n/k个模块分别将链表倒转。
具体做法:定义一个ans虚拟节点next指向head,pre节点等于ans,curr等于head。
在循环中next为curr的下一个节点,curr的next指向next.next,next.next指向pre.next。pre的next指向next。
在循环外pre等于curr,curr下一一位。画个k=3的草图就是这样。
Java题解
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ public ListNode reverseKGroup (ListNode head, int k) { // write code here ListNode ans = new ListNode(0); ans.next = head; //构建一个新节点 int n = 0; //结点的总数 ListNode curr = head; while(head != null){ head = head.next; n++; } ListNode pre = ans; //循环中的前置结点 for(int i = 0; i < n/k; i++){ //分模块倒转链表 for(int l = 1; l < k; l++){ //一个模块中的链表 ListNode next = curr.next; curr.next = next.next; //必然不会报空指针,因为k=1不会走到这儿 next.next = pre.next; //倒转 pre.next = next; } pre = curr; curr = curr.next; } return ans.next; } }