链表深拷贝(Java)指南
作为一名经验丰富的开发者,我将教会你如何实现链表的深拷贝。在本指南中,我们将按照以下步骤进行操作。
流程概览
首先,让我们来整理一下整个流程,并用表格展示每个步骤:
journey
title 链表深拷贝流程
section 创建新链表
新链表头节点 -> 创建新节点
...
section 遍历原链表
原链表头节点 -> 遍历原链表
...
section 复制节点
当前节点 -> 创建新节点
...
section 连接节点
当前节点 -> 连接新节点
...
section 更新指针
当前节点 -> 更新指针
...
section 返回新链表
新链表头节点 -> 返回新链表
步骤详解
1. 创建新链表
我们首先需要创建一个新链表,用于存储深拷贝后的链表。
// 创建新链表头节点
Node newHead = new Node(head.val);
我们通过使用原链表的头节点值来创建新链表的头节点。
2. 遍历原链表
接下来,我们需要遍历原链表,并复制每个节点。
Node curr = head.next;
Node newCurr = newHead;
我们使用两个指针,curr
指向原链表中当前节点,newCurr
指向新链表中当前节点。
3. 复制节点
在遍历原链表的过程中,我们需要为新链表创建节点,并将原链表节点的值复制给新链表节点。
while (curr != null) {
Node newNode = new Node(curr.val);
newCurr.next = newNode;
// 更新指针
curr = curr.next;
newCurr = newCurr.next;
}
我们创建一个新节点 newNode
并将其值设置为当前原链表节点 curr
的值。然后,我们将新节点连接到新链表中,并更新指针,继续遍历原链表。
4. 连接节点
在复制节点后,我们需要连接新链表中的节点,以保持链表的结构。
newCurr.next = curr.next;
我们将新链表中当前节点 newCurr
的 next
指针连接到原链表中当前节点 curr
的 next
指针。
5. 更新指针
最后,我们需要更新指针以继续遍历原链表和新链表。
curr = curr.next;
newCurr = newCurr.next;
我们将原链表和新链表的指针向前移动一个位置。
6. 返回新链表
最后一步是返回新链表的头节点。
return newHead;
我们将新链表的头节点 newHead
返回给调用者。
现在你已经了解了整个流程,并知道每个步骤需要做什么。下面是完整的代码示例:
class Node {
int val;
Node next;
Node(int val) {
this.val = val;
}
}
public Node deepCopyLinkedList(Node head) {
if (head == null) {
return null;
}
// 创建新链表头节点
Node newHead = new Node(head.val);
// 遍历原链表
Node curr = head.next;
Node newCurr = newHead;
while (curr != null) {
// 复制节点
Node newNode = new Node(curr.val);
newCurr.next = newNode;
// 连接节点
newCurr.next.next = curr.next;
// 更新指针
curr = curr.next;
newCurr = newCurr.next;
}
// 返回新链表
return newHead;
}
通过这个实现,你可以在调用 deepCopyLinkedList
方法时,传入原链表的头节点,并得到一个深拷贝后的链表。
希望这篇文章对你有帮助!