力扣经典150题第五十九题: 随机链表的复制

简介: 力扣经典150题第五十九题: 随机链表的复制

标题:使用Java实现随机链表的深拷贝

随机链表的深拷贝是一道经典的链表问题,需要在复制链表的同时处理随机指针。在本文中,我们将使用Java来解决LeetCode上的第五十九题,实现随机链表的深拷贝。

1. 题目分析

题目要求给定一个随机链表的头节点,我们需要复制该链表并返回复制链表的头节点。每个节点除了有普通的next指针外,还有一个random指针,指向链表中的任意节点或空节点。

2. 解题思路

为了实现随机链表的深拷贝,我们可以使用HashMap来存储原节点和复制节点之间的映射关系。具体步骤如下:

  • 第一次遍历:创建新节点,并将原节点和新节点的映射关系存储在HashMap中。
  • 第二次遍历:根据HashMap中的映射关系,复制原链表的next指针和random指针。

3. Java代码实现

import java.util.HashMap;
import java.util.Map;
class Node {
    int val;
    Node next, random;
    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
public class CopyRandomList {
    public Node copyRandomList(Node head) {
        if (head == null) return null;
        Map<Node, Node> map = new HashMap<>();
        Node cur = head;
        // 第一次遍历:创建新节点,并建立原节点和新节点的映射关系
        while (cur != null) {
            map.put(cur, new Node(cur.val));
            cur = cur.next;
        }
        cur = head;
        // 第二次遍历:复制next指针和random指针
        while (cur != null) {
            map.get(cur).next = map.get(cur.next);
            map.get(cur).random = map.get(cur.random);
            cur = cur.next;
        }
        return map.get(head);
    }
}

4. 测试示例

我们使用几个示例来测试我们的代码:

public class Main {
    public static void main(String[] args) {
        // 示例1
        Node node1 = new Node(7);
        Node node2 = new Node(13);
        Node node3 = new Node(11);
        Node node4 = new Node(10);
        Node node5 = new Node(1);
        node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;
        node2.random = node1; node3.random = node5; node4.random = node3; node5.random = node1;
        CopyRandomList solution = new CopyRandomList();
        Node copiedList1 = solution.copyRandomList(node1);
        printList(copiedList1);
        // 示例2
        Node node6 = new Node(1);
        Node node7 = new Node(2);
        node6.next = node7;
        node6.random = node7;
        node7.random = node7;
        Node copiedList2 = solution.copyRandomList(node6);
        printList(copiedList2);
    }
    public static void printList(Node head) {
        Node cur = head;
        while (cur != null) {
            System.out.print("[" + cur.val + ", ");
            if (cur.random != null) {
                System.out.print(cur.random.val);
            } else {
                System.out.print("null");
            }
            System.out.print("] ");
            cur = cur.next;
        }
        System.out.println();
    }
}

5. 总结

本文介绍了如何使用Java实现随机链表的深拷贝。通过HashMap来建立原节点和新节点之间的映射关系,实现了链表的深拷贝。这是一道经典的链表问题,在面试中也经常会被考察到。

public class BlogEnding {
    public static void main(String[] args) {
        encourageEngagement();
    }
    public static void encourageEngagement() {
        System.out.println("🚀 感谢您阅读本文!如果您觉得有收获,请一键三连:点赞 ❤️️、转发 🔁、评论 💬,并加关注哦!");
    }
}

相关文章
|
1天前
|
Java
力扣经典150题第六十题:反转链表 II
力扣经典150题第六十题:反转链表 II
5 1
|
1天前
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
9 2
|
1天前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
4 0
|
15天前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
15 2
|
18天前
|
Java Python
二刷力扣--链表
二刷力扣--链表
|
19天前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
22天前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
|
18天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
18天前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
19天前
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积
【LeetCode刷题】前缀和解决问题:742.寻找数组的中心下标、238.除自身以外数组的乘积