真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++復(fù)雜鏈表的復(fù)制-創(chuàng)新互聯(lián)

復(fù)雜鏈表節(jié)點結(jié)構(gòu):

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、豐滿網(wǎng)站維護、網(wǎng)站推廣。

C++ 復(fù)雜鏈表的復(fù)制

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é)點后面)

圖示:

C++ 復(fù)雜鏈表的復(fù)制

代碼實現(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é)果:

C++ 復(fù)雜鏈表的復(fù)制

總結(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

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部