leetcode138. Copy List with Random Pointer

题目:题目链接

思路:深度拷贝。有递归和迭代两种方式

方法一 递归

参考:官方题解

class Solution {
public:
	unordered_map<Node*, Node*> cachedNode;

	Node* copyRandomList(Node* head) {
		if (head == nullptr) {
			return nullptr;
		}
		if (!cachedNode.count(head)) {//不重复创建结点
			Node* headNew = new Node(head->val);
			cachedNode[head] = headNew;
			headNew->next = copyRandomList(head->next);//线copy next
			headNew->random = copyRandomList(head->random);//再copy random
		}
		/*注意递归函数,可认为执行该函数后已经实现拷贝功能
		 *1.先拷贝当前结点,然后拷贝next,再拷贝random
		 *2.为什么不先拷贝random,因为执行拷贝next,其实就相当于新创建了一条只有next的单链表
		 */
		return cachedNode[head];
	}
};

方法二 非递归

参考的解答:参考解答
这位大神还有视频讲解,非常通俗易懂,时间也不长建议看完。看完了也大概可以理解递归的版本了。

class Solution {
public:
	unordered_map<Node*, Node*>cacheNode;
	Node* copyRandomList(Node* head) {
		if (head == nullptr) return nullptr;
		Node* copy_head = head;
		Node* pre_node = new Node(head->val);
		Node* tmp_node = pre_node;
		cacheNode[copy_head] = pre_node;
		while (copy_head->next) {//第一轮把它看成单链表只拷贝next
			Node* next_node = new Node(copy_head->next->val);
			pre_node->next = next_node;
			pre_node = next_node;
			copy_head = copy_head->next;
			cacheNode[copy_head] = pre_node;
		}
		while (head) {//拷贝random
			cacheNode[head]->random = cacheNode[head->random];
			head = head->next;
		}
		return tmp_node;
	}
};

加油加油!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值