0

我正在尝试将一个列表复制到另一个列表中,我有其他方法,例如删除,当我测试它们时,复制方法似乎正在编辑原始列表。

复制方法如下所示。

public ImmutableList<T> copy(ImmutableLinkedList<T> list) {
    Node n = list.head;
    ImmutableLinkedList<T> listcopy = new ImmutableLinkedList<T>();
    listcopy.head = list.head;

   copynode(list.head.next, listcopy.head.next);
   return listcopy;
}

private Node copynode(Node list, Node listcopy){
    if(list == null){
        return listcopy;
    } else{
        listcopy.data = list.data;
        listcopy.next = list.next;
     return copynode(list.next, listcopy.next);
    }
}

将代码更改为此,但仍然无法正常工作

public void copy(ImmutableListImplement<T> list) {


  ImmutableListImplement<T> listcopy = new ImmutableListImplement<T>();

    this.head = copynode(list.head, listcopy.head);


}

private Node copynode(Node list, Node listcopy){


    if(list == null){
        return listcopy;
    } else{

        listcopy = new Node();
        listcopy.data = list.data;
        listcopy.next = list.next;


        copynode(list.next, listcopy.next);
    }
    return listcopy;
}
4

2 回答 2

1

listcopy.head是对原始列表头元素的引用。它根本不是副本。然后你将它copynode作为参数传递给方法listcopy,并copynode与其中的条目混淆。

实际上,在第 6 行的调用中, list.head.next== listcopy.head.next(如,两者都指向完全相同的 Node 对象)copynode()。这就是问题所在。

于 2019-12-11T16:46:07.837 回答
0

如果您尝试连接多个不可变列表,则可以使用静态内部类 ImmutableList.Builder。

        List<String> list = new ArrayList<>( 
            Arrays.asList("4", "5", "6"));

        ImmutableList<String> iList = ImmutableList.<String>builder() 
                                        .add("1", "2", "3")
                                        .addAll(list) 
                                        .build(); 

        System.out.println(iList); 

输出:[1,2,3,4,5,6]

于 2019-12-11T17:49:04.967 回答