目錄
?1.隨機(jī)鏈表的復(fù)制
1.2題目描述?
1.3題目分析
1.4解題:
2.順序表和鏈表對(duì)比
2.1cpu高速緩存利用率
3.結(jié)語(yǔ)
?1.隨機(jī)鏈表的復(fù)制
一個(gè)長(zhǎng)度為?n
?的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針?random
?
該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。?
?
?
?
1.2題目描述?
構(gòu)造這個(gè)鏈表的?深拷貝。?深拷貝應(yīng)該正好由?n
?個(gè)?全新?節(jié)點(diǎn)組成,其中每個(gè)新節(jié)點(diǎn)的值都設(shè)為其對(duì)應(yīng)的原節(jié)點(diǎn)的值。新節(jié)點(diǎn)的?next
?指針和?random
?指針也都應(yīng)指向復(fù)制鏈表中的新節(jié)點(diǎn),并使原鏈表和復(fù)制鏈表中的這些指針能夠表示相同的鏈表狀態(tài)。復(fù)制鏈表中的指針都不應(yīng)指向原鏈表中的節(jié)點(diǎn)?。
例如,如果原鏈表中有?X
?和?Y
?兩個(gè)節(jié)點(diǎn),其中?X.random --> Y
?。那么在復(fù)制鏈表中對(duì)應(yīng)的兩個(gè)節(jié)點(diǎn)?x
?和?y
?,同樣有?x.random --> y
?。
返回復(fù)制鏈表的頭節(jié)點(diǎn)。
用一個(gè)由?n
?個(gè)節(jié)點(diǎn)組成的鏈表來(lái)表示輸入/輸出中的鏈表。每個(gè)節(jié)點(diǎn)用一個(gè)?[val, random_index]
?表示:
-
val
:一個(gè)表示?Node.val
?的整數(shù)。 -
random_index
:隨機(jī)指針指向的節(jié)點(diǎn)索引(范圍從?0
?到?n-1
);如果不指向任何節(jié)點(diǎn),則為??null
?。
你的代碼?只?接受原鏈表的頭節(jié)點(diǎn)?head
?作為傳入?yún)?shù)。
1.3題目分析
首先,鏈表的拷貝如果是普通鏈表的話,使用遍歷+尾插即可。
深度拷貝就是要鏈表結(jié)構(gòu)也一樣
但是由于隨機(jī)指針的存在。我們沒(méi)辦法知道或者就是說(shuō)我們拷貝的節(jié)點(diǎn)的隨機(jī)指針該指向那個(gè)位置。那么就有一種簡(jiǎn)單粗暴的方法:
遍歷鏈表然后匹配隨機(jī)指針。
那么巧妙的一種辦法,就是將復(fù)制的節(jié)點(diǎn)插到被復(fù)制節(jié)點(diǎn)的后面,這種方法巧妙。時(shí)間復(fù)雜度為O(N).空間復(fù)雜度也為O(1).
while(cur)//循環(huán)申請(qǐng)插入 { //每次都申請(qǐng)節(jié)點(diǎn) struct Node* copy = ( struct Node*)malloc(sizeof( struct Node)); //尾插 cur->val = copy->val; cur ->next = copy; copy->next = next; cur = next; //往后走一步 next = cur->next; }
?那么對(duì)于隨機(jī)指針的連接:
我們發(fā)現(xiàn),我們?cè)湵淼墓?jié)點(diǎn)的隨機(jī)指針指向的節(jié)點(diǎn)的next剛好就是我們復(fù)制鏈表節(jié)點(diǎn)的隨機(jī)指針要指向的節(jié)點(diǎn),所以:
//還要使用cur遍歷 cur = head; struct Node* copy = cue->next; while(cur) { if(cur->random == NULL) { copy->random = NULL; } else { copy->random = cur->random->next; } cur = copy->next; copy = cur->next; }
然后我們將復(fù)制的節(jié)點(diǎn)從原鏈表取下來(lái)尾插成新的鏈表,復(fù)原原鏈表就OK了:
1.4解題:
?
struct Node* copyRandomList(struct Node* head) {
//1.首先先將復(fù)制的節(jié)點(diǎn)尾插到各個(gè)節(jié)點(diǎn)的后面
assert(head);//斷言,不能傳入一個(gè)空鏈表
struct Node* cur = head;
struct Node* next = cur->next;
while(cur)//循環(huán)申請(qǐng)插入
{
//每次都申請(qǐng)節(jié)點(diǎn)
struct Node* copy = ( struct Node*)malloc(sizeof( struct Node));
//尾插
cur->val = copy->val;
cur ->next = copy;
copy->next = next;
cur = next;
//往后走一步
next = cur->next;
}
//還要使用cur遍歷
cur = head;
struct Node* copy = cur->next;
while(cur)
{
if(cur->random == NULL)
{
copy->random = NULL;
}
else
{
copy->random = cur->random->next;
}
cur = copy->next;
copy = cur->next;
}
cur = head;
struct Node* copyhead = NULL;//新鏈表的頭結(jié)點(diǎn)
struct Node* copytail = NULL;//定義一個(gè)尾結(jié)點(diǎn)方便尾插
//還是遍歷解除復(fù)原
while(cur)
{
copy = cur->next;
next = copy->next;
//將cope結(jié)點(diǎn)開(kāi)始尾插
if(copytail == NULL)//此時(shí)新鏈表一個(gè)元素都沒(méi)有
{
copyhead = copytail = copy;
}
else
{
copytail->next = copy;
copytail = copytail->next;
}
cur ->next = next;
cur =next;
}
return copyhead;
}
2.順序表和鏈表對(duì)比
? ? 不同點(diǎn)???????????????? 順序表??????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?鏈表
存儲(chǔ)空間上????物理上一定連續(xù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?邏輯上連續(xù),但物理上不一定 連續(xù)
隨機(jī)訪問(wèn) ????????支持O(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ?不支持:O(N)
?任意位置插入或者刪除元素可能需要搬移元素,效率低 O(N)? ? ?只需修改指針指向?
插入? ? ? ? ? 動(dòng)態(tài)順序表,空間不夠時(shí)需要 擴(kuò)容? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 沒(méi)有容量的概念
應(yīng)用場(chǎng)景? ? ? ?元素高效存儲(chǔ)+頻繁訪問(wèn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 任意位置插入和刪除頻繁?
緩存利用率? ? ? ? ? ? ? ? ? ? 高? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 低
2.1cpu高速緩存利用率
硬件上的存儲(chǔ)分層如下圖:
?
3.結(jié)語(yǔ)
?鏈表和順序表的知識(shí)到這里基本就告一段落,那么大家可以從知識(shí)到解題詳細(xì)回顧一下。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-838008.html
可以結(jié)合圖解多看一下代碼,結(jié)合理解。以上就是本期的所有內(nèi)容,知識(shí)含量蠻多,大家可以配合解釋和原碼運(yùn)行理解。創(chuàng)作不易,大家如果覺(jué)得還可以的話,歡迎大家三連,有問(wèn)題的地方歡迎大家指正,一起交流學(xué)習(xí),一起成長(zhǎng),我是Nicn,正在c++方向前行的奮斗者,數(shù)據(jù)結(jié)構(gòu)內(nèi)容持續(xù)更新中,感謝大家的關(guān)注與喜歡。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-838008.html
到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)和算法初階(C語(yǔ)言)】復(fù)雜鏈表(隨機(jī)指針,隨機(jī)鏈表的復(fù)制)題目詳解+鏈表順序表結(jié)尾的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!