138.M 随机链表的复制

Problem: 138. 随机链表的复制

思路

思路1:用一个map存储新旧节点的映射关系。第一步先复制节点,第二步把新节点的next和random指针指向正确的位置。

思路2:先复制节点,让旧节点指向复制后的新节点。然后把新节点的random指针指向正确的位置。最后再把两个链表拆开。

Code

代码1:

func copyRandomListV1(head *Node) *Node {
	nodeMap := make(map[*Node]*Node)
	p := head
	for p != nil {
		nodeMap[p] = &Node{Val: p.Val}
		p = p.Next
	}

	p = head
	for p != nil {
		nodeMap[p].Next = nodeMap[p.Next]
		nodeMap[p].Random = nodeMap[p.Random]
		p = p.Next
	}

	return nodeMap[head]
}

代码2:

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Next *Node
 *     Random *Node
 * }
 */

func copyRandomList(head *Node) *Node {
	if head == nil {
		return head
	}

	// 复制
	for p := head; p != nil; p = p.Next.Next {
		p.Next = &Node{Val: p.Val, Next: p.Next}
	}

	// 赋值复制后的节点的random指针
	for p := head; p != nil; p = p.Next.Next {
		if p.Random != nil {
			p.Next.Random = p.Random.Next
		}

	}

	// 拆开链表
	newHead := head.Next
	for p1 := head; p1 != nil; p1 = p1.Next {
		p2 := p1.Next
		p1.Next = p1.Next.Next
		if p2.Next != nil {
			p2.Next = p2.Next.Next
		}
	}

	return newHead
}

Last updated

Was this helpful?