链表深拷贝(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;

我们将新链表中当前节点 newCurrnext 指针连接到原链表中当前节点 currnext 指针。

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 方法时,传入原链表的头节点,并得到一个深拷贝后的链表。

希望这篇文章对你有帮助!