java - 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;
}
解决方案
如果您不需要深拷贝,您应该能够将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;
}
此外,此方法可能应该是构造函数或静态方法。要求一个不修改列表状态的方法的实例是没有意义的。
推荐阅读
- java - 当我将一个长变量传递给 Thread.Sleep() 时,这不起作用
- java - 如何在 Android 应用中查找文件输出流的目录?
- python-3.x - 在第 5 行用文本编辑器编写
- go - go install 不创建软件包的二进制文件,而 go get 能够
- memory - 循环管道占用大量内存
- regex - 在某些特殊情况下需要从删除中保存单行
- java - 是否有任何选项可以使用循环自动创建几个 ArrayLists?
- javascript - 非提交按钮上的文本验证需要属性?
- c# - 无法使用 Imagemagick 将 PDF 转换为 C# 中的任何图像格式
- c++ - Boost 序列化:SIGABRT 同时对包含 std::shared_ptr 的对象反序列化 boost::shared_ptr