【数据结构】复杂链表深度拷贝

一、复杂链表深度拷贝

####【1】题目:
已知一个复杂链表,该链表除了有一个指向下一个节点的指针外,还有一个指向任意节点的指针,
求:
设计一种方法,拷贝构造该链表

####【2】算法思路:
1、使用一个map,将链表的地址映射成一个整数,即给链表的每个节点编号
2、使用一个vector,将新链表中的节点按照map中的指向指好
####【3】代码实现:

#include<iostream>
#include<vector>
#include<map>
using namespace std;

struct RandomList
{
	int label;
	RandomList* next;
	RandomList* random;
	RandomList(int x)
		:label(x)
		,next(NULL)
		,random(NULL)
	{}
};

class solution
{
public:
	RandomList* CopyRandList( RandomList* head)
	{
		map<RandomList*, int> node_map;
		vector<RandomList*> node_vec;

	    RandomList* ptr = head ;
	    int  i = 0 ;
	while(ptr)
	{
		node_vec.push_back(new RandomList(ptr->label));
		node_map[ptr] = i;
		ptr =ptr->next ;
		i++;
	}
	node_vec.push_back(0);
	ptr = head;
	i = 0; 
	
	while(ptr)
	{
		node_vec[i]->next = node_vec[i+1];

		if(ptr->random )
		{
			int id = node_map[ptr->random ];
			node_vec[i]->random = node_vec[id];
		}
		ptr = ptr->next ;
		i++;
	}
	return node_vec[0];
	}
};
int main()
{
	RandomList a(1);
	RandomList b(2);
	RandomList c(3);
	RandomList d(4);
	RandomList e(5);

	a.next = &b;
	b.next = &c;
	c.next = &d;
	d.next = &e;
	e.next = NULL;

	a.random = &c;
	b.random = &d;
	c.random = &c;
	e.random = &d;
	d.random = NULL;
	
	solution solve;
	RandomList* result = solve.CopyRandList(&a);

	while(result)
	{
		printf("label = [ %d ]    ",result->label );

		if(result->random )
		{
			printf("rand = %d\n" ,result->random->label );
		}
		else
		{
			printf("rand = NULL\n");
		}
		result = result->next ;
	}
	return 0;
}

####【4】结果展示:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值