實(shí)現(xiàn)函數(shù)ComplexListNode* Clone(ComplexListNode* pHead),復(fù)制一個(gè)復(fù)雜鏈表。在復(fù)雜鏈表中,每個(gè)結(jié)點(diǎn)除了有一個(gè)m_pNext的指針指向下一個(gè)結(jié)點(diǎn)外,還有一個(gè)m_pSibling的指針指向鏈表中任意結(jié)點(diǎn)或者NULL。
成都創(chuàng)新互聯(lián)專注于涼州企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),購(gòu)物商城網(wǎng)站建設(shè)。涼州網(wǎng)站建設(shè)公司,為涼州等地區(qū)提供建站服務(wù)。全流程按需求定制制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)如下如所示的一個(gè)復(fù)雜鏈表,沒有畫出_sib指針的結(jié)點(diǎn)表示_sib指向NULL:
對(duì)于復(fù)雜鏈表的復(fù)制,首先可以想到的是先遍歷一遍鏈表復(fù)制出各個(gè)結(jié)點(diǎn)并設(shè)置好_next指針,復(fù)制好單向的鏈表之后,對(duì)于_sib的隨機(jī)指針則需要每一次都從頭遍歷找出距當(dāng)前結(jié)點(diǎn)多遠(yuǎn)的結(jié)點(diǎn)才是應(yīng)該指向的隨機(jī)結(jié)點(diǎn),雖然可行,但不難發(fā)現(xiàn)這樣尋找隨機(jī)結(jié)點(diǎn)的時(shí)間復(fù)雜度是O(N*N);
首先,有一種方法,仍然是先遍歷鏈表創(chuàng)建出相應(yīng)的結(jié)點(diǎn)并設(shè)置好每一個(gè)的_next指針,之后用一個(gè)哈希桶來(lái)保存每一個(gè)原鏈表結(jié)點(diǎn)的地址和新創(chuàng)建出結(jié)點(diǎn)的地址信息,也就是在每一個(gè)原鏈表結(jié)點(diǎn)地址的下面鏈上新創(chuàng)建出對(duì)應(yīng)的鏈表結(jié)點(diǎn)的地址,這樣的話一次就能定位新復(fù)制出鏈表中每一個(gè)結(jié)點(diǎn)的_sib應(yīng)該指向哪一個(gè)對(duì)應(yīng)的結(jié)點(diǎn)了;雖然時(shí)間復(fù)雜度降為了O(N),但這是一種以空間換時(shí)間的方法;
另外的一種方法,是在遍歷到原鏈表的一個(gè)結(jié)點(diǎn)的時(shí)候,就新創(chuàng)建出一個(gè)結(jié)點(diǎn)插入當(dāng)前結(jié)點(diǎn)的后面,完成之后原鏈表就變成了兩個(gè)連續(xù)重復(fù)的結(jié)點(diǎn)的雙倍長(zhǎng)度的鏈表,這樣的話,原來(lái)鏈表中結(jié)點(diǎn)的_sib后面的重復(fù)的結(jié)點(diǎn),也就會(huì)是新創(chuàng)建鏈表對(duì)應(yīng)結(jié)點(diǎn)的_sib的指向,之后再?gòu)念^訪問(wèn)鏈表,將原鏈表中每個(gè)結(jié)點(diǎn)對(duì)應(yīng)的_sib指針后面的結(jié)點(diǎn)賦值給當(dāng)前結(jié)點(diǎn)后面新創(chuàng)建結(jié)點(diǎn)的_sib,這樣也就完成了新建鏈表的_sib指向,之后再將兩個(gè)鏈表拆開就可以了;
程序設(shè)計(jì)如下:
#include <iostream> #include <assert.h> using namespace std; int list_num = 0; struct ComplexListNode//復(fù)雜鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu) { int _val; ComplexListNode* _next; ComplexListNode* _sib; ComplexListNode(int val)//構(gòu)造函數(shù) :_val(val) ,_next(NULL) ,_sib(NULL) {} }; ComplexListNode* Buy_Node(int val)//構(gòu)建復(fù)雜鏈表結(jié)點(diǎn) { ComplexListNode* node = new ComplexListNode(val); return node; } //插入結(jié)點(diǎn) void Push_Node(ComplexListNode** phead, int val) { if((*phead) == NULL) (*phead) = Buy_Node(val); else { ComplexListNode* tmp = (*phead); while(tmp->_next != NULL) tmp = tmp->_next; tmp->_next = Buy_Node(val); } ++list_num; } //設(shè)置自由結(jié)點(diǎn)的指向 void SetSibPointer(ComplexListNode* head, int* positions) { assert(head && positions); ComplexListNode* tmp = head; ComplexListNode *p[list_num]; for(size_t i = 0; i < list_num; ++i) { p[i] = tmp; tmp = tmp->_next; } tmp = head; for(size_t i = 0; i < list_num; ++i) { if(positions[i] != 0) tmp->_sib = p[positions[i]]; tmp = tmp->_next; } } //銷毀鏈表 void DestoryList(ComplexListNode* head) { if(head != NULL) { ComplexListNode* tmp = head; while(head != NULL) { head = head->_next; delete tmp; tmp = NULL; tmp = head; } } } //打印鏈表 void PrintList(ComplexListNode* head) { if(head != NULL) { ComplexListNode *tmp = head; while(tmp != NULL) { cout<<tmp->_val<<"->"; tmp = tmp->_next; } cout<<"NULL"<<endl; tmp = head; while(tmp != NULL) { cout<<tmp->_val<<" sibling is ->"; if(tmp->_sib != NULL) cout<<tmp->_sib->_val<<endl; else cout<<"NULL"<<endl; tmp = tmp->_next; } } } //復(fù)制復(fù)雜鏈表 ComplexListNode* Clone(ComplexListNode* head) { if(head != NULL) { ComplexListNode *tmp = head; ComplexListNode *newnode = NULL; //復(fù)制每個(gè)結(jié)點(diǎn)并插入當(dāng)前結(jié)點(diǎn)的后面 while(tmp != NULL) { newnode = Buy_Node(tmp->_val); newnode->_next = tmp->_next; tmp->_next = newnode; tmp = newnode->_next; } //設(shè)置新創(chuàng)建鏈表結(jié)點(diǎn)的sib指針的指向 tmp = head; newnode = tmp->_next; while(tmp != NULL) { if(tmp->_sib != NULL) newnode->_sib = tmp->_sib->_next; tmp = newnode->_next; if(tmp != NULL) newnode = tmp->_next; } //拆分兩個(gè)鏈表 tmp = head; ComplexListNode* NewHead = tmp->_next; newnode = tmp->_next; while(tmp != NULL) { tmp->_next = newnode->_next; tmp = tmp->_next; if(tmp != NULL) { newnode->_next = tmp->_next; newnode = newnode->_next; } } return NewHead; } } int main() { ComplexListNode* head = NULL; Push_Node(&head, 7); Push_Node(&head, 5); Push_Node(&head, 8); Push_Node(&head, 2); Push_Node(&head, 6); Push_Node(&head, 9); Push_Node(&head, 3); int positions[7] = {2,5,0,4,0,0,4}; SetSibPointer(head, positions); cout<<"Complex List: "; PrintList(head); ComplexListNode* NewComplexListHead = Clone(head); cout<<"New Complex List: "; PrintList(NewComplexListHead); cout<<"Complex List: "; PrintList(head); DestoryList(head); DestoryList(NewComplexListHead); return 0; }
運(yùn)行程序:
《完》
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站名稱:復(fù)雜鏈表的復(fù)制——26-創(chuàng)新互聯(lián)
當(dāng)前路徑:http://www.chinadenli.net/article30/dhsdpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站內(nèi)鏈、網(wǎng)站改版、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容