这里类似于平均分苹果,先把苹果一个一个平分到每个人手上。随后把剩余的苹果从头开始往后分。
因此我们需要求出链表的长度n,然后用链表长度n/分隔的部分的个数k,得到每个部分一开始应有的节点个数;最后用链表长度n%分隔的部分的个数k,得到剩余的节点数。
struct ListNode** splitListToParts(struct ListNode* head, int k, int* returnSize) {
struct ListNode* *ret = (struct ListNode**)malloc(k * sizeof(struct ListNode*));
int n = 0;
struct ListNode* cur = head;
//记录链表长度
while(cur)
{
n++;
cur = cur->next;
}
int quoiet = n/k; //每个部分应有的节点数
int remainder = n%k; //分完后剩余的结点数
// 重置
cur = head;
for(int i =0;i<k;i++)
{
//令cur为当前部分链表的头
ret[i] = cur;
if(cur != NULL)
{
int retsize = quoiet + (i<remainder ? 1 : 0);
for(int j=1; j < retsize; j++)
{
cur = cur->next;
}
struct ListNode* next = cur->next;
cur->next = NULL;
cur = next;
}
}
*returnSize = k;
return ret;
}