修改当前示例的副本是否会影响当前示例( java 语)

smtd7mpg  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(382)

昨天我对java中的双链表有一个问题,我的代码的这一部分有一个令人困惑的注解

public ADList<K,D> split(K key){

// caching the current list
ADList<K, D> temp = this;

// looking for the key k to be split on
while(temp.head.key != key && temp.head.succ != null){
    temp.head = temp.head.succ;
}
...

}

在这里,我保存了调用该方法的双链表的当前示例,以查找具有传递给函数的键的节点。我这样做是为了不修改当前示例的列表。
但我被告知这是错误的 temp 实际上不是列表的副本,而是指向当前示例列表的指针的副本。这意味着函数将改变当前示例而不是副本。
是我错了,还是那个人把java和c混淆了(哈哈)我真的很感激一些洞察力:)谢谢大家!

thtygnil

thtygnil1#

实际上,您正在存储对当前列表的引用。所以现在改成 temp 将影响 this ,您的方法将更改原始列表。想想看:

ADList<K, D> temp = this;

存储对列表的引用,而不是列表本身。
当你这么做的时候也一样:

ADList<K, D> list = ...
ADLlist<K, D> temp = list;  // not a copy, both refer to the same list object

如果要制作副本,必须实现自己的机制,例如使用副本构造函数:

ADList<K, D> temp = new ADList<>(this);

承包商会做任何必要的事情来创建一个 ADList 与传递给其参数的列表内容相同。这可能意味着创建新的 Node 为每个 Node 有着相同的数据。
考虑到您要解决的问题,似乎您希望在给定的键上拆分一个链表。最好是在医院手术 Node 水平。您可以遍历原始列表(即。 this )不需要修改。然后为左侧和右侧子列表创建新节点(请参见将链接列表分成两半并返回后半部分作为示例)。

相关问题