您好,登錄后才能下訂單哦!
復雜鏈表節點結構:
struct ComplexNode { ComplexNode(const int& d) :_data(d) ,_next(NULL) ,random(NULL) {} int _data; //數據域 ComplexNode* _next; //指向下一節點 ComplexNode* _random; //指向隨機節點 };
復制復雜鏈表可以分為三步來完成:
第一步:將新復制的節點插入到原來鏈表當中(插入到原節點后面)
圖示:
代碼實現:
void CloneNodes(ComplexNode* pHead) { ComplexNode* cur = pHead; while(cur) { ComplexNode* NewHead = new ComplexNode(); //開辟新節點 NewHead->_data = cur->_data; NewHead->_next = cur->_next; NewHead->_random = NULL; cur->_next = NewHead; //連接新節點 cur = NewHead->_next; //跳轉到下一個要復制的節點 } }
第二步:修改新開辟的節點的_random,新的_random其實就是舊的_random的_next(新開辟的節點鏈在原來節點的后面,所以就是舊的_random->_next)
代碼實現:
void UpdateNewNodeRandom(ComplexNode* pHead) { ComplexNode* cur = pHead; while(cur) { ComplexNode* next = cur->_next; //指向新節點 if(cur->_random != NULL) //優化:隨機指針不為空時,復制 { next->_random = cur->_random->_next; //復制隨機指針 } cur = next->_next; //下一個要復制的節點 } }
第三步:將復制出來的鏈表拆分出來
代碼實現:
ComplexNode* DisconnectNewNode(ComplexNode* pHead) { ComplexNode* cur = pHead; //指向原來的節點 ComplexNode* next = NULL; //指向復制出來的節點 ComplexNode* pNewHead = NULL; //新鏈表的頭節點 if(cur != NULL) { pNewHead = next = cur->_next; //指向新鏈表的頭 cur->_next = next->_next; //將新節點分離 cur = next->_next; } while(cur) { next->_next = cur->_next; //往復制出的鏈表上面連接新節點 next = next->_next; //分離新節點 cur->_next = next->_next; cur = next->_next; } return pNewHead; //返回新鏈表的頭結點 }
最后復制復雜鏈表就轉化下面代碼:
ComplexNode<T>* CopyComplexLinkList(ComplexNode<T>* pHead) { if(pHead != NULL) //判空 { CloneNodes<T>(pHead); //復制節點并連接在其后面 UpdateNewNodeRandom(pHead); //更新新節點的隨機指針 return DisconnectNewNode<T>(pHead);/ /拆分鏈表并返回新鏈表的頭結點 } return NULL; }
創建復雜鏈表:
ComplexNode* CreatList() { ComplexNode* Node1 = new ComplexNode(1); //創建節點 ComplexNode* Node2 = new ComplexNode(2); ComplexNode* Node3 = new ComplexNode(3); ComplexNode* Node4 = new ComplexNode(4); ComplexNode* Node5 = new ComplexNode(5); Node1->_next = Node2; //連接節點 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<<"("<<cur->_data<<","<<cur->_random->_data<<")"<<"->"; cur = cur->_next; } cout<<"Nvl."<<endl; }
測試代碼:
void Test() { ComplexNode* head = CreatList(); Print(head); cout<<"---------------------------------------"<<endl; ComplexNode* NewHead = CopyList(head); Print(NewHead); }
測試結果:
總結:復雜鏈表的復制分為三步:第一步就是把新復制出來的節點插入源鏈表中,第二步修改新插入節點的隨機指針,第三步就是將新節點從源中拆分出來,并合并成一個新鏈表。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。