You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

我的Linked List程序拷贝构造函数编写正确吗?该如何实现?

拷贝构造函数实现逻辑

拷贝构造函数的核心是生成完全独立的新链表实例,新老链表节点完全隔离,修改任意一个都不会影响另一个:

  • 先校验传入的待拷贝链表other是否为空、是否为空链表,满足任意一种直接返回即可
  • 遍历other的所有节点,为每个节点创建新的Node副本,保留原节点的数值
  • 将新节点按原链表的顺序串联,赋值给当前实例的head
  • 注意不要直接复用other的Node实例,也不要直接调用addToFront插入节点,否则会导致节点顺序和原链表相反
完整代码实现

补充了三个要求的构造函数:无参构造、拷贝构造、int数组初始化构造,同时补全了拷贝构造的逻辑:

public class LinkedListOfInts {
    Node head;

    private class Node {
        int value;
        Node nextNode;

        public Node(int value, Node nextNode) {
            this.value = value;
            this.nextNode = nextNode;
        }

    }
    
    // 第一个构造函数:无参构造
    public LinkedListOfInts() {
        
    }

    // 第二个构造函数:int数组初始化构造
    public LinkedListOfInts(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        // 从后往前插入保证顺序和数组一致
        for (int i = nums.length - 1; i >= 0; i--) {
            addToFront(nums[i]);
        }
    }
    
    // 第三个构造函数:拷贝构造函数
    public LinkedListOfInts(LinkedListOfInts other) {
        // 非空校验
        if (other == null || other.head == null) {
            return;
        }
        // 遍历原链表,逐个拷贝节点
        Node currentOther = other.head;
        // 新链表的头和尾指针
        Node newHead = null;
        Node newTail = null;
        while (currentOther != null) {
            Node newNode = new Node(currentOther.value, null);
            if (newHead == null) {
                newHead = newNode;
                newTail = newNode;
            } else {
                newTail.nextNode = newNode;
                newTail = newNode;
            }
            currentOther = currentOther.nextNode;
        }
        this.head = newHead;
    }

    public void addToFront(int x) {
        head = new Node(x, head);
    }

    public String toString() {
        StringBuilder result = new StringBuilder(" ");
        for (Node ptr = head; ptr != null; ptr = ptr.nextNode)
            result.append(ptr.value).append(" ");
        return result.toString();
    }

    public static void main(String[] args) {
        // 测试1:基础功能测试
        LinkedListOfInts list1 = new LinkedListOfInts();
        for (int i = 0; i < 15; i++) {
            list1.addToFront(i);
        }
        System.out.println("原链表list1:" + list1);

        // 测试2:拷贝构造函数测试
        LinkedListOfInts copyList = new LinkedListOfInts(list1);
        System.out.println("拷贝得到的copyList:" + copyList);

        // 验证独立性:修改原链表,拷贝链表不受影响
        list1.addToFront(999);
        System.out.println("修改后原链表list1:" + list1);
        System.out.println("修改原链表后copyList:" + copyList);

        // 测试3:数组初始化构造测试
        int[] arr = {10,20,30,40};
        LinkedListOfInts list2 = new LinkedListOfInts(arr);
        System.out.println("数组初始化的list2:" + list2);
    }

}
验证说明

运行main方法可以看到:

  • 拷贝得到的链表和原链表内容完全一致
  • 给原链表头部新增元素后,拷贝链表没有发生任何变化,符合深拷贝的要求
  • 三个构造函数都可以正常使用

内容的提问来源于stack exchange,提问作者user16854661

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:48:03