我的Node
类,表示链表的节点,定义如下:
public class Node
{
Node next;
String data;
public Node (String data)
{
this.data = data;
}
}
我正在使用它:
Node node, head, tail;
String name; // name to be entered
int count = 0;
// initialize the head to null
head = null;
do
{
System.out.print ("Enter a name. Type q to end.");
name = stdin.readLine ();
// create a new node if the user doesn't type q
if (!name.equals ("q"))
{
node = new Node (name);
node.next = head;
count++;
// update the head to point to the new front of the list
head = node;
}
}
while (!name.equals ("q")); // loop continues until "quit" selected
node = head;
假设我想在修改原始列表的情况下将名称备份到方法。我怎样才能做到这一点?无需将其写入文件。
名称是存储在链接列表中的变量,在用户按下q之后我想修改列表,同时保留用户存储的内容作为备份,以防他/她想要回溯或查看原始列表。
答案 0 :(得分:1)
最好使Node不可变。因此,每次要修改节点时,都会创建一个新节点。并将旧的存储在链接列表历史记录中。
答案 1 :(得分:0)
所以听起来好像你想保留链表中每个元素的先前名称的历史记录。我建议您在链表的每个节点中存储一个数组或链表,以显示该项的先前历史记录。例如:
public class Node
{
Node next;
String data;
LinkedList<String> history;
public Node (String data)
{
this.data = data;
}
}
您可以通过多种方式填充此内容,这完全取决于您的使用案例。
另外,为什么要实现自己的链表? Java已经附带了一个链表实现(java.util.LinkedList)。如果你需要一个链表种类的有序列表,我建议使用它。如果您这样做,那么创建一个包含在其中的新数据结构,其中包含名称和历史记录,然后只保留其中的历史记录,例如:
public class DataItem
{
String data;
LinkedList<String> history = new LinkedList<>();
public DataItem (String data)
{
this.data = data;
}
public void setData (String data)
{
this.history.add(0, this.data);
this.data = data;
}
}
最后,请记住字符串在Java中是不可变的。因此,无法修改字符串。您只需要在某处保留对先前字符串的引用,您不需要复制该值。
要最终复制对象树,您需要执行所谓的深层复制,基本上遍历完整结构和所有集合,并将每个对象克隆到新对象中。