首页 > 解决方案 > JAVA 不可变,复制链表

问题描述

我的任务是在 Java 中创建一个必须是不可变的 Linked List 类。这已完成与此处完全相同:

https://www.geeksforgeeks.org/linked-list-set-1-introduction/

在其他方法中,我需要一个addToList方法,将一个或多个值添加到链接列表的尾部。由于链接列表是不可变的,添加到它应该创建链接列表的副本(即具有相同内容的新 LinkedList 对象),并且只将所需的值添加到新创建的副本中。

复制功能是我需要帮助的地方。下面是copyList函数,部分完成。我正在遍历 LinkedList 中的每个节点并成功打印出数据。现在我需要将该数据分配给clonedList中的相应元素(新副本)。请看下图。

public LinkedList<T> copyList(LinkedList<T> toCopy) {
    Node n = toCopy.head;
    LinkedList clonedList = new LinkedList<T>();

    while(n != null) {
        System.out.println("Copying: " + n.data);
        /*code here(?) to assign elements to clonedList,
        but how?
         */
        n = n.next;

    }

    return clonedList;


}

标签: javalinked-listimmutability

解决方案


如果您不需要深拷贝,您应该能够将head克隆列表设置为原始列表,例如:

LinkedList<T> clonedList = new LinkedList<>();
clonedList.head = toCopy.head;

否则,在每次循环迭代中构造一个新节点并将其添加到克隆列表中。在我看来,你有自己的LinkedList实现但没有add方法,所以要么写一个,要么替换示例中的方法调用。

Node<T> n = toCopy.head;
LinkedList<T> clonedList = new LinkedList<>();

while(n != null) {
    Node<T> nClone = new Node<>(toCopy.data);
    clonedList.add(nClone);
    n = n.next;
}

此外,此方法可能应该是构造函数或静态方法。要求一个不修改列表状态的方法的实例是没有意义的。


推荐阅读