如何在java中复制链表?

时间:2012-12-04 15:24:06

标签: java linked-list

我的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之后我想修改列表,同时保留用户存储的内容作为备份,以防他/她想要回溯或查看原始列表。

2 个答案:

答案 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中是不可变的。因此,无法修改字符串。您只需要在某处保留对先前字符串的引用,您不需要复制该值。

要最终复制对象树,您需要执行所谓的深层复制,基本上遍历完整结构和所有集合,并将每个对象克隆到新对象中。