? ? ? ? 首先直接進(jìn)入主題,題目鏈接??力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺
源代碼在最后,有更優(yōu)解的朋友歡迎在評論里指導(dǎo)我一番!
1.題目分析
通過題目分析得出結(jié)論:
? ? ? ? 1. 將鏈表分為k個子鏈表
? ? ? ? 2. 用一個數(shù)組存放這k個子鏈表,數(shù)組的長度就是k
? ? ? ? 3. 任意兩個子鏈表的長度差不能超過1,也就是要么子鏈表長度都是2或者別的數(shù)字,要么子鏈表之間可以是2,2,2,1或者3,3,2等。子鏈表的長度跟鏈表的長度和k有關(guān)。
? ? ? ? 4. 子鏈表存放到數(shù)組的順序不能改變,也就是說鏈表是從頭開始分隔的,依次再存放到數(shù)組里。
? ? ? ? 5. 既然數(shù)組是存放子鏈表的,那準(zhǔn)確來說數(shù)組元素是鏈表某一節(jié)點的地址,之后通過這個節(jié)點能找到后面的節(jié)點,直到每個子鏈表的節(jié)點到NULL的時候。
我們用圖解來展示一下:
? ? ? ? 我們?yōu)榱烁蜗蟮恼宫F(xiàn)數(shù)組里的元素,直接把子鏈表放入,但我們要知道存放的其實是每個子鏈表的頭節(jié)點的地址!
文章來源:http://www.zghlxwxcb.cn/news/detail-739518.html
知道這樣之后,我們直接上代碼,代碼里有詳細(xì)介紹!文章來源地址http://www.zghlxwxcb.cn/news/detail-739518.html
2.源代碼
struct ListNode** Create(int k,int* returnSize)
{
*returnSize = k;
struct ListNode** output = (struct ListNode**)malloc(sizeof(struct ListNode*) * k);
if(output == NULL)
{
perror("malloc fail");
exit(-1);
}
//注意?。。。。?!1
//這里不初始化會報錯的,因為我們這個指針數(shù)組存的是指針,必須初始化為空,否則都是野指針
//你想想一個指針數(shù)組存放的都是野指針,沒有任何意義!
for(int i = 0; i < k; i++)
{
output[i] = NULL;
}
return output;
}
struct ListNode** splitListToParts(struct ListNode* head, int k, int* returnSize)
{
//我們要知道這個題返回的是什么,本題返回的是一個二級指針,也就是存放一級指針的地址,所以在這里開辟的數(shù)組
//應(yīng)該是存放的是鏈表節(jié)點的地址
//我們清楚返回值之后就寫題吧
//創(chuàng)建一個指針數(shù)組output,用來存放鏈表節(jié)點的地址
struct ListNode** output = Create(k,returnSize);
//鏈表為空的時候,這個數(shù)組都是空指針,因為我們初始化為空了,所以直接返回就可以了。
if(head == NULL)
return output;
//鏈表不為空的時候
//我們先求鏈表長度,看分隔的段數(shù)是否大于鏈表長度
struct ListNode* cur = head;
int len = 0;
while(cur)
{
len++;
cur = cur->next;
}
//當(dāng)鏈表長度小于要分隔的段數(shù)時,很明顯鏈表的節(jié)點是不夠用的
//當(dāng)添加完節(jié)點之后,剩下的用空指針補齊,我們上面初始化了已經(jīng),所以不需要對空指針這里做代碼
if(len < k)
{
cur = head;
int i = 0;
while(cur)
{
struct ListNode* next = cur->next;
output[i] = cur;
cur->next = NULL;
cur = next;
i++;
}
}
//當(dāng)鏈表長度大于分隔的段數(shù)k
//我們這里就要注意一點,任意兩部分長度的差距不能超過一
else
{
//這里我們通過n來知道分k段,剩了幾個節(jié)點
int n = len % k;
//通過m知道,最開始一段分幾個節(jié)點。
int m = len / k;
int i = 0;
cur = head;
//任意兩個部分的長度差距不超過一,那么我們就讓第一部分加1,第二部分加1,依次加一,但是加幾個呢?
//看n是幾,就加幾次
while(n--)
{
m = len / k;
output[i] = cur;
while(m)
{
cur = cur->next;
m--;
}
struct ListNode* next = cur->next;
cur->next = NULL;
cur = next;
i++;
}
//在分配完剩余節(jié)點個數(shù)之后,就正常的一段應(yīng)該是幾個節(jié)點
//這里的條件就是下標(biāo)i小于數(shù)組元素個數(shù)
while(i < k)
{
m = len / k - 1;
output[i] = cur;
while(m)
{
cur = cur->next;
m--;
}
struct ListNode* next = cur->next;
cur->next = NULL;
cur = next;
i++;
}
}
//最后返回output
return output;
}
到了這里,關(guān)于LeetCode刷題之分隔鏈表(圖解?代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!