leetcode刷题笔记一百三十八题 复制带随机指针的链表

leetcode刷题笔记一百三十八题 复制带随机指针的链表

源地址:138. 复制带随机指针的链表

问题描述:

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的 深拷贝。

我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

//138题的思路主要参考了133题 克隆图的DFS深拷贝方法
/**
 * Definition for a Node.
 * class Node(var _value: Int) {
 *   var value: Int = _value
 *   var next: Node = null
 *   var random: Node = null
 * }
 */

import scala.collection.mutable
object Solution {
    def copyRandomList(head: Node): Node = {
        if (head == null) return null
        val visited =  mutable.HashMap.empty[Node, Node]

        def helper(node: Node, visited: mutable.HashMap[Node, Node]): Node = {
            if (visited.contains(node)) return visited(node)
        
            val cloneNode = new Node(node.value)
            visited.put(node, cloneNode)

            if (node.next != null) cloneNode.next = helper(node.next, visited)
            if (node.random != null) cloneNode.random = helper(node.random, visited)
            return cloneNode
        }
        helper(head, visited)
    }
}
posted @ 2020-08-19 23:04  ganshuoos  阅读(107)  评论(0编辑  收藏  举报