亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ 復雜鏈表的復制

發布時間:2020-05-27 07:46:00 來源:網絡 閱讀:413 作者:xujiafan_2015 欄目:編程語言

復雜鏈表節點結構:

C++ 復雜鏈表的復制

struct ComplexNode
{
    ComplexNode(const int& d)
        :_data(d)
        ,_next(NULL)
        ,random(NULL)
    {}
    int _data;            //數據域
    ComplexNode* _next;               //指向下一節點
    ComplexNode* _random;             //指向隨機節點
};

復制復雜鏈表可以分為三步來完成:

第一步:將新復制的節點插入到原來鏈表當中(插入到原節點后面)

圖示:

C++ 復雜鏈表的復制

代碼實現:

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);
}

測試結果:

C++ 復雜鏈表的復制

總結:復雜鏈表的復制分為三步:第一步就是把新復制出來的節點插入源鏈表中,第二步修改新插入節點的隨機指針,第三步就是將新節點從源中拆分出來,并合并成一個新鏈表。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

当雄县| 南汇区| 清新县| 贺兰县| 彰化县| 罗源县| 通州区| 杭锦后旗| 绥中县| 错那县| 益阳市| 巴彦淖尔市| 肥乡县| 华容县| 阜新市| 太康县| 邮箱| 靖州| 托克托县| 汉阴县| 特克斯县| 高安市| 临湘市| 当阳市| 阳西县| 连平县| 奉新县| 辽源市| 苏尼特左旗| 衡水市| 英吉沙县| 同德县| 通山县| 永泰县| 博野县| 理塘县| 汤阴县| 德惠市| 内江市| 云和县| 凤翔县|