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 中实现单链表的深拷贝了。深拷贝的关键是在复制节点时确保不共享内存,这样新链表的修改不会影响到原链表。当你动手实现这个示例时,记得调试和验证链表复制的正确性。祝你编程愉快!