Java 中单链表的深拷贝

在 Java 中,单链表的深拷贝是一个常见的任务,特别是当你需要复制一个链表及其所有节点的值时。深拷贝会创建一个与原链表不同的副本,即副本中的节点与原链表中的节点并不共享内存。本文将引导你完成整个流程,并提供清晰的代码示例。

深拷贝单链表的步骤

我们可以将深拷贝单链表的步骤整理成如下表格:

步骤 描述
1 创建链表节点类
2 定义深拷贝方法
3 在拷贝过程中复制节点并构建新链表
4 返回新链表的头节点

下面,我们将详细介绍每个步骤,并写出所需的代码。

1. 创建链表节点类

class ListNode {
    int value;           // 节点的值
    ListNode next;      // 指向下一个节点的引用

    ListNode(int value) {
        this.value = value; // 构造函数,初始化节点的值
    }
}

2. 定义深拷贝方法

我们需要一个方法来实现链表的深拷贝。该方法将返回新链表的头节点。

public ListNode deepClone(ListNode head) {
    if (head == null) { // 如果原链表为空,直接返回空
        return null;
    }

3. 拷贝节点并构建新链表

使用一个映射(HashMap)来存储原节点和新节点之间的关系,以便我们在复制next引用时能够找到对应的新节点。

    // 创建一个哈希表用于存储旧节点和新节点的映射
    Map<ListNode, ListNode> map = new HashMap<>();
    
    // 第一次遍历,创建新节点并填充哈希表
    ListNode current = head;
    while (current != null) {
        map.put(current, new ListNode(current.value)); // 将旧节点映射到新节点
        current = current.next; // 移动到下一个节点
    }

    // 第二次遍历,设置新节点的next引用
    current = head;
    while (current != null) {
        ListNode newNode = map.get(current); // 获取新节点
        newNode.next = map.get(current.next); // 设置next引用
        current = current.next; // 移动到下一个旧节点
    }

4. 返回新链表的头节点

在完成上述两个遍历后,我们就拥有了新链表。最后一步是返回新链表的头节点。

    return map.get(head); // 返回新链表的头节点
}

完整代码示例

将所有步骤组合在一起,我们得到的完整深拷贝方法如下:

import java.util.HashMap;
import java.util.Map;

class ListNode {
    int value;
    ListNode next;
    
    ListNode(int value) {
        this.value = value;
    }
}

public class LinkedListClone {
    public ListNode deepClone(ListNode head) {
        if (head == null) {
            return null;
        }
        
        Map<ListNode, ListNode> map = new HashMap<>();
        
        // 第一次遍历
        ListNode current = head;
        while (current != null) {
            map.put(current, new ListNode(current.value));
            current = current.next;
        }

        // 第二次遍历
        current = head;
        while (current != null) {
            ListNode newNode = map.get(current);
            newNode.next = map.get(current.next);
            current = current.next;
        }
        
        return map.get(head);
    }
}

结尾

通过以上步骤,你应该能够了解如何在 Java 中实现单链表的深拷贝了。深拷贝的关键是在复制节点时确保不共享内存,这样新链表的修改不会影响到原链表。当你动手实现这个示例时,记得调试和验证链表复制的正确性。祝你编程愉快!