[LeetCode]Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

思考:先进行单链表复制,在定义random指针,每个结点的random指针都要遍历一次链表,时间复杂度为O(n2)。

/**
 * 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) {}
 * };
 */
class Solution {
public:
	RandomListNode *copyList(RandomListNode *head)
	{
		if(head==NULL) return head;
		RandomListNode *newhead=NULL;
		RandomListNode *p=head;
		RandomListNode *q=newhead;
		while(p)
		{
			RandomListNode *node=new RandomListNode(NULL);
			node->label=p->label;
			if(newhead==NULL)
			{
				newhead=node;
				q=node;
			}
			else
			{
				q->next=node;
				q=q->next;
			}
			p=p->next;
		}
		return newhead;
	}
	void copyRandomPointer(RandomListNode *head,RandomListNode *newhead)
	{
		if(head==NULL||newhead==NULL) return;
		RandomListNode *p=head;
		RandomListNode *q=newhead;
		RandomListNode *a,*b;
		while(p)
		{
			if(p->random==NULL) 
				q->random==NULL;
			else
			{
				a=head;b=newhead;
				while(p->random!=a)
				{
					a=a->next;
					b=b->next;
				}
				q->random=b;
			}
			p=p->next;
			q=q->next;
		}
	}
    RandomListNode *copyRandomList(RandomListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if(head==NULL) return head;
		RandomListNode *newhead=copyList(head);
		copyRandomPointer(head,newhead);
		return newhead;
    }
};

  上述方法,时间都耗费在寻找random指针上。怎样在O(1)时间里找到random指向结点,是本题需要精髓所在。参考这里

/**
 * 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) {}
 * };
 */
class Solution {
public:
	void CloneNodes(RandomListNode *head)
	{
		RandomListNode *p=head;
		while(p)
		{
			RandomListNode *node=new RandomListNode(p->label);
			node->next=p->next;
			p->next=node;
			p=node->next;
		}
	}
	void CopyRandomPointer(RandomListNode *head)
	{
		RandomListNode *p=head;
		while(p)
		{
			if(p->random==NULL) 
				p->next->random=NULL;
			else
				p->next->random=p->random->next;
			p=p->next->next;
		}
	}
	RandomListNode *SeparateList(RandomListNode *head)
	{
		RandomListNode *p=head;
		RandomListNode *newhead=NULL;		
		RandomListNode *q=newhead;
		while(p)
		{
			if(newhead==NULL)
			{
				newhead=q=p->next;
				p->next=q->next;
                p=p->next;
			}
			else
			{
				q->next=p->next;
				q=q->next;
				p->next=q->next;
				p=p->next;
			}
		}
		return newhead;
	}
    RandomListNode *copyRandomList(RandomListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if(head==NULL) return head;
		CloneNodes(head);
		CopyRandomPointer(head);		
		return SeparateList(head);
    }
};

  总感觉百度后好像失去了什么。。学习解题思路,而不是解题方法,切记!

posted @ 2013-11-17 03:14  七年之后  阅读(233)  评论(0编辑  收藏  举报