C語言數(shù)據(jù)結(jié)構(gòu)之復(fù)雜鏈表的拷貝
題目:
給你一個(gè)長度為 n 的鏈表,每個(gè)節(jié)點(diǎn)包含一個(gè)額外增加的隨機(jī)指針 random ,該指針可以指向鏈表中的任何節(jié)點(diǎn)或空節(jié)點(diǎn)。
構(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)。
struct Node {
int val;
struct Node *next;
struct Node *random;
};
思路:
因?yàn)槊總€(gè)節(jié)點(diǎn)還有一個(gè)隨機(jī)指針,向拷貝標(biāo)準(zhǔn)單向鏈表的方式才處理,是有困難的;
第一步,先將拷貝的節(jié)點(diǎn)鏈在原節(jié)點(diǎn)后面
struct Node* cur = head; while (cur) { struct Node* new = (struct Node*)malloc(sizeof(struct Node)); new->val = cur->val; new->next = cur->next; cur->next = new; cur = new->next; }
第二步,處理隨機(jī)指針,因?yàn)榭截惖木驮谠?jié)點(diǎn)后面,拷貝的隨機(jī)指針就指向原節(jié)點(diǎn)隨機(jī)指針的后一個(gè);
struct Node* cur = head; while (cur) { struct Node* copy = cur->next; if (cur->random == NULL) { copy->random = NULL; } else { copy->random = cur->random->next; } cur = copy->next; }
第三步,將鏈表分開,并返回拷貝鏈表的頭;
程序:
struct Node* copyRandomList(struct Node* head) { if (head == NULL) { return NULL; } struct Node* cur = head; while (cur) { struct Node* new = (struct Node*)malloc(sizeof(struct Node)); new->val = cur->val; new->next = cur->next; cur->next = new; cur = new->next; } cur = head; while (cur) { struct Node* copy = cur->next; if (cur->random == NULL) { copy->random = NULL; } else { copy->random = cur->random->next; } cur = copy->next; } cur = head; struct Node* copyHead = head->next ,*copy_n=copyHead->next,*copy=copyHead; while (cur) { if (copy_n == NULL) { copy->next = NULL; cur->next = NULL; return copyHead; } else { cur->next = copy_n; copy->next = copy_n->next; } cur = copy_n; copy = copy_n->next; copy_n = copy->next; } return copyHead; }
到此這篇關(guān)于C語言數(shù)據(jù)結(jié)構(gòu)之復(fù)雜鏈表的拷貝的文章就介紹到這了,更多相關(guān)C語言 數(shù)據(jù)結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序簡明教程
這篇文章主要介紹了VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的方法,結(jié)合實(shí)例形式詳細(xì)講述了ADO的原理及VC使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Qt5開發(fā)視頻播放器的項(xiàng)目實(shí)踐
Qt對(duì)音視頻的播放和控制、相機(jī)拍攝、收音機(jī)等多媒體應(yīng)用提供了強(qiáng)大的支持,本文主要介紹了Qt5開發(fā)視頻播放器,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08C語言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn)
這篇文章主要介紹了C語言中快速排序和插入排序優(yōu)化的實(shí)現(xiàn),包括雙向劃分快速排序方法的介紹,需要的朋友可以參考下2015-11-11C語言以數(shù)據(jù)塊的形式讀寫文件實(shí)例代碼
本文主要介紹C語言中以數(shù)據(jù)塊的形式讀寫文件,這里提供了實(shí)例代碼舉例說明,有需要的小伙伴可以參考下2016-07-07