Copy List with Random Pointer

题目链接:https://leetcode.com/problems/copy-list-with-random-pointer/
这道题目比较经典,头条等多个大厂都考过,《剑指offer》中也有。

基础解法

创建新链表,先拷贝基础信息,再拷贝random指针。

func copyRandomList(head *Node) *Node {
    p := head
	var dummyHead Node
	pHead := &dummyHead
	// 存储新旧节点的映射
	mp := make(map[*Node]*Node)
	for p != nil {
		newNode := &Node{
			Val: p.Val,
		}
		mp[p] = newNode
		pHead.Next = newNode
		pHead = pHead.Next
		p = p.Next
	}
	// 开始copy random指针
	p = head
	pHead = dummyHead.Next
	for p != nil {
		if p.Random != nil {
			pHead.Random = mp[p.Random]
		}
		pHead = pHead.Next
		p = p.Next
	}
	return dummyHead.Next
}

高级解法

新节点直接放在旧节点之后,设置完random指针之后, 再拆分链表。

func copyRandomList(head *Node) *Node {
	// clone 节点
	p := head
	for p != nil {
		pClone := &Node{
			Val: p.Val,
			Next: p.Next,
		}
		p.Next = pClone
		p = pClone.Next
	}
	// clone random 指针
	p = head
	for p != nil {
		pClone := p.Next
		if p.Random != nil {
			pClone.Random = p.Random.Next
		}
		p = pClone.Next
	}
	// 拆分链表
	p = head
	var dummyHead Node
	pHead := &dummyHead
	for p != nil {
		pClone := p.Next
		pHead.Next = pClone
		pHead = pHead.Next

		p.Next = pClone.Next
		p = p.Next
	}
	return dummyHead.Next
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值