復(fù)雜鏈表節(jié)點結(jié)構(gòu):
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、豐滿網(wǎng)站維護、網(wǎng)站推廣。struct ComplexNode { ComplexNode(const int& d) :_data(d) ,_next(NULL) ,random(NULL) {} int _data; //數(shù)據(jù)域 ComplexNode* _next; //指向下一節(jié)點 ComplexNode* _random; //指向隨機節(jié)點 };
復(fù)制復(fù)雜鏈表可以分為三步來完成:
第一步:將新復(fù)制的節(jié)點插入到原來鏈表當(dāng)中(插入到原節(jié)點后面)
圖示:
代碼實現(xiàn):
void CloneNodes(ComplexNode* pHead) { ComplexNode* cur = pHead; while(cur) { ComplexNode* NewHead = new ComplexNode(); //開辟新節(jié)點 NewHead->_data = cur->_data; NewHead->_next = cur->_next; NewHead->_random = NULL; cur->_next = NewHead; //連接新節(jié)點 cur = NewHead->_next; //跳轉(zhuǎn)到下一個要復(fù)制的節(jié)點 } }
第二步:修改新開辟的節(jié)點的_random,新的_random其實就是舊的_random的_next(新開辟的節(jié)點鏈在原來節(jié)點的后面,所以就是舊的_random->_next)
代碼實現(xiàn):
void UpdateNewNodeRandom(ComplexNode* pHead) { ComplexNode* cur = pHead; while(cur) { ComplexNode* next = cur->_next; //指向新節(jié)點 if(cur->_random != NULL) //優(yōu)化:隨機指針不為空時,復(fù)制 { next->_random = cur->_random->_next; //復(fù)制隨機指針 } cur = next->_next; //下一個要復(fù)制的節(jié)點 } }
第三步:將復(fù)制出來的鏈表拆分出來
代碼實現(xiàn):
ComplexNode* DisconnectNewNode(ComplexNode* pHead) { ComplexNode* cur = pHead; //指向原來的節(jié)點 ComplexNode* next = NULL; //指向復(fù)制出來的節(jié)點 ComplexNode* pNewHead = NULL; //新鏈表的頭節(jié)點 if(cur != NULL) { pNewHead = next = cur->_next; //指向新鏈表的頭 cur->_next = next->_next; //將新節(jié)點分離 cur = next->_next; } while(cur) { next->_next = cur->_next; //往復(fù)制出的鏈表上面連接新節(jié)點 next = next->_next; //分離新節(jié)點 cur->_next = next->_next; cur = next->_next; } return pNewHead; //返回新鏈表的頭結(jié)點 }
最后復(fù)制復(fù)雜鏈表就轉(zhuǎn)化下面代碼:
ComplexNode* CopyComplexLinkList(ComplexNode * pHead) { if(pHead != NULL) //判空 { CloneNodes (pHead); //復(fù)制節(jié)點并連接在其后面 UpdateNewNodeRandom(pHead); //更新新節(jié)點的隨機指針 return DisconnectNewNode (pHead);/ /拆分鏈表并返回新鏈表的頭結(jié)點 } return NULL; }
創(chuàng)建復(fù)雜鏈表:
ComplexNode* CreatList() { ComplexNode* Node1 = new ComplexNode(1); //創(chuàng)建節(jié)點 ComplexNode* Node2 = new ComplexNode(2); ComplexNode* Node3 = new ComplexNode(3); ComplexNode* Node4 = new ComplexNode(4); ComplexNode* Node5 = new ComplexNode(5); Node1->_next = Node2; //連接節(jié)點 Node2->_next = Node3; Node3->_next = Node4; Node4->_next = Node5; Node1->_random = Node3; //置_random Node2->_random = Node4; Node3->_random = Node1; Node4->_random = Node5; Node5->_random = Node2; return Node1; //返回頭 }
打印鏈表:
void Print(ComplexNode* _head) { ComplexNode* cur = _head; while(cur) { cout<<"("<_data<<","< _random->_data<<")"<<"->"; cur = cur->_next; } cout<<"Nvl."< 測試代碼:
void Test() { ComplexNode* head = CreatList(); Print(head); cout<<"---------------------------------------"<測試結(jié)果:
總結(jié):復(fù)雜鏈表的復(fù)制分為三步:第一步就是把新復(fù)制出來的節(jié)點插入源鏈表中,第二步修改新插入節(jié)點的隨機指針,第三步就是將新節(jié)點從源中拆分出來,并合并成一個新鏈表。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站名稱:C++復(fù)雜鏈表的復(fù)制-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/csijpd.html