我的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
相关产品推荐
相关产品推荐

