原题地址
题目描述
题目思路
方法一:回溯 + 哈希表
- 与普通链表拷贝不同的是,该链表节点存在指向随机节点random,因此在拷贝过程中可能出现当前节点的random节点还未创建的情况。那么可以考虑先拷贝链表顺序,再遍历新链表对各个节点的random进行赋值。
- 然而这种做法会造成对原链表的多次查找。原因是对新链表的每一个节点,都需要返回原链表中查找到对应的random。
- 因此需要考虑避免多次查找,降低时间复杂度。
- 根据此需求,可以考虑使用哈希表来存储新旧链表节点。由于哈希表采用key-value形式存储数据,因此可以直接通过哈希表记录原来的旧节点对应复制后的新节点,即map(原节点,新节点)。
方法二:拼接 + 拆分
原节点 1 -> 新节点 1 -> 原节点 2 -> 新节点 2 -> ……
- 构建如上图所示的拼接链表,如此便可在访问原节点的 random 指向节点的同时找到新对应新节点的 random 指向节点。
代码实现
使用到的方法
- put(key,value):向表中添加键值对。
- get(key):根据key查找对应的value。
回溯 + 哈希表
class Solution {
Map<Node,Node> table = new HashMap<Node,Node>();