剑指 Offer 35. 复杂链表的复制(Java、回溯、哈希表、拼接与拆分)

原题地址

剑指 Offer 35. 复杂链表的复制

题目描述

在这里插入图片描述

题目思路

方法一:回溯 + 哈希表

  • 与普通链表拷贝不同的是,该链表节点存在指向随机节点random,因此在拷贝过程中可能出现当前节点的random节点还未创建的情况。那么可以考虑先拷贝链表顺序,再遍历新链表对各个节点的random进行赋值。
  • 然而这种做法会造成对原链表的多次查找。原因是对新链表的每一个节点,都需要返回原链表中查找到对应的random。
  • 因此需要考虑避免多次查找,降低时间复杂度。
  • 根据此需求,可以考虑使用哈希表来存储新旧链表节点。由于哈希表采用key-value形式存储数据,因此可以直接通过哈希表记录原来的旧节点对应复制后的新节点,即map(原节点,新节点)。

方法二:拼接 + 拆分

原节点 1 -> 新节点 1 -> 原节点 2 -> 新节点 2 -> ……

  • 构建如上图所示的拼接链表,如此便可在访问原节点的 random 指向节点的同时找到新对应新节点的 random 指向节点。

代码实现

使用到的方法

  1. put(key,value):向表中添加键值对。
  2. get(key):根据key查找对应的value。

回溯 + 哈希表

class Solution {
   

    Map<Node,Node> table = new HashMap<Node,Node>();
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值