Copy List with Random Pointer

Description:

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.

Challenge

Could you solve it with O(1) space?

Solution:

/**
 * 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:
	/**
	 * @param head: The head of linked list with a random pointer.
	 * @return: A new head of a deep copy of the list.
	 */
	RandomListNode *copyRandomList(RandomListNode *head) {
		if (!head) return nullptr;
		auto node = head;
		while (node) {
			auto tmp = node->next;
			node->next = new RandomListNode(node->label);
			node->next->next = tmp;
			node = tmp;
		}
		node = head;
		while (node) {
			if (node->random) node->next->random = node->random->next;
			node = node->next->next;
		}
		node = head;
		auto rc = head->next;
		while (node) {
			auto tmp = node->next->next;
			if (tmp) node->next->next = tmp->next;
			node->next = tmp;
			node = tmp;
		}
		return rc;
	}
};
posted @ 2015-09-13 03:23  影湛  阅读(97)  评论(0编辑  收藏  举报