我们第一轮肯定是要全部扫描一遍链表,否则我们不知道链表长度,分割也就无从谈起。
再看分割条件,划分为元素个数为k的数组,那么我们只需要计算出一个部分的长度,然后在第二次遍历链表的时候,把每个部分的第一个节点加入数组中,最后一个节点的next设为null即可。
那么一个部分的数量得是多少合适呢?由以下公式给出:
1. basicLen = n / k
2. rem = n % k
3. 对于第 i 组,其长度就是 len = basicLen + (i < rem? 1: 0)
最后讨论循环边界条件
1. 开始,curr = root
2. 分为 k 组,因为 i = 0 to k - 1
3. 计算出 len 之后,因为我们现在指向第一个元素,现在要把指针挪到最后一个元素,因此需要进行的是 len - 1 次取 next,即 j = 0 to len - 1
4. 我们拿一个 temp = curr,然后 curr = curr.next
5. temp.next = null
6. 如果有某些部分的长度为 0,那么 curr 将会变成 null,此时以上逻辑就不管用了。要么另外设置逻辑,将数组后续元素置 null,要么根据语言特性跳出循环,利用默认的 null 值直接返回。