Java代码题:复制带随机指针的链表(哈希)

链接:复制带随机节点的链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点,要求返回这个链表的深拷贝。

方法1:用HashMap来解决
复制带随机节点的单链表
用哈希记录对应关系,代码如下

/*
class Node {
    int val;
    Node next;
    Node random;
    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/
class Solution {
    public Node copyRandomList(Node head) {
        Map<Node,Node> map = new HashMap<>();
        Node cur = head;
        //将旧节点作为key,新节点作为value,放入map中
        while(cur!=null){
            Node node = new Node(cur.val);
            map.put(cur,node);
            cur= cur.next;
        }
        cur = head;
        while(cur!=null){
        	//根据map中的对应关系,连接新链表
            map.get(cur).next=map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur= cur.next;
        }
        return map.get(head);
    }
}

核心代码

            map.get(cur).next=map.get(cur.next);
            map.get(cur).random = map.get(cur.random);

map.get(cur)获取cur对应的值,即得到新链表的node节点, map.get(cur).next拿到node.next进行赋值,
map.get(cur.next)拿到cur.next对应的新节点,并将此赋给node.next.

random的赋值,和next赋值过程相同,不再解释。

方法2:
(1)进行关联
在这里插入图片描述
(2)修改新节点的random值
在这里插入图片描述
(3)新老节点进行交替更新
在这里插入图片描述

class Solution {
    public Node copyRandomList(Node head) {
        if(head == null){
          return null;
      }

     //1、老新交替链接,进行一个对应关联
      Node cur = head;
      while(cur != null) {
          Node node = new Node(cur.val,cur.next,null);
          Node tmp = cur.next;
          cur.next = node;
          cur = tmp;
      }
      // 2、修改新节点的random
      cur = head;
      while(cur != null) {
          if(cur.random != null) {
              cur.next.random = cur.random.next;
              cur = cur.next.next;
          }else{
            cur = cur.next.next;
          }
      }
     //3、将老新节点 打开
      cur = head;
      Node newHead = cur.next;
      while(cur.next != null) {
          Node tmp = cur.next;
          cur.next = tmp.next;
          cur = tmp;
      }
      return newHead;    
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
 本次课程会着大家学习Hash算法,从源码的角度去学习算法,更加容易理解的方式去学习,能够更高效的吸收学到的内容,也能培养出能够独自看源码,分析源码的能力。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。  哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。  通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果。如果输入数据中有变化,则哈希也会发生变化。哈希可用于许多操作,包括身份验证和数字签名。也称为“消息摘要”。  简单解释:哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值