leetCode——随机链表复制

#include 
using namespace std;
//Definition for singly-linked list with a random pointer.
struct RandomListNode {
	int label;
	RandomListNode *next, *random;
	RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};

struct node{
	RandomListNode * src;
	RandomListNode * dst;
	node(RandomListNode * srcc, RandomListNode * dstt ){
		src = srcc;
		dst = dstt;
	}
	node (){
		src = NULL;
		dst = NULL;
	}
};
struct assMap{
	node myMap[1000];
	int cur;
	assMap(){
		cur = 0 ;
	}
	void ins(node p){
		for( int i = 0 ; i< cur; i++){
			if( myMap[i].src == p.src){
				return ;
			}
		}
		myMap[cur++] = p;
	}
	RandomListNode* find (RandomListNode *srcc){
		for( int i = 0 ; i< cur; i++){
			if( myMap[i].src == srcc ){
				return myMap[i].dst;
			}
		}
		return NULL;
	}
};
class Solution {
public:
	RandomListNode *copyRandomList(RandomListNode *head) {
		//判断合法
		RandomListNode * srcNode =  head;
		if( srcNode == NULL) return NULL;
		//辅助变量
		assMap myM;
		myM.ins(node(NULL,NULL));
		//复制带next的链表
		RandomListNode * cpyHead = new RandomListNode( srcNode->label);


		myM.ins(node(srcNode,cpyHead));
		RandomListNode * p = cpyHead;

		while( srcNode->next != NULL){
			p->next = new RandomListNode(srcNode->next->label);
			myM.ins(node(srcNode->next,p->next));
			p = p->next;
			srcNode = srcNode-> next;
		}

		//复制random
		p = cpyHead;
		srcNode = head;

		p->random = myM.find(srcNode->random);
		while( p->next != NULL ){
			p = p->next;
			srcNode = srcNode ->next;

			p->random = myM.find(srcNode->random);
		}
		return cpyHead;
	}
};

int main()
{
	RandomListNode * p = new RandomListNode(10);
	RandomListNode * q = p ;

	int n = 10;
	while ( n--)
	{
		 q->next = new RandomListNode(n);
		 q = q->next;
	}

	q= p;
	while ( q != NULL)
	{
		cout<< q->label<<' ';
		q = q->next;
	}
	cout<next != NULL)
	{
		q ->next->random = q;
		q = q->next;
	}
	q = p;
	while ( q !=NULL)
	{
		if( q->random!= NULL)
		{
			cout<random->label<<' ';
		}
		else
		{
			cout<<"  ";
		}
		q = q->next;
	}
	


	cout<label<<' ';
		t = t->next;
	}
	cout<random!= NULL)
		{
			cout<random->label<<' ';
		}
		else
		{
			cout<<"  ";
		}
		t = t->next;
	}
	return 0;
}

你可能感兴趣的:(c++,leetcode,链表)