昨天我对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混淆了(哈哈)我真的很感激一些洞察力:)谢谢大家!
1条答案
按热度按时间thtygnil1#
实际上,您正在存储对当前列表的引用。所以现在改成
temp
将影响this
,您的方法将更改原始列表。想想看:存储对列表的引用,而不是列表本身。
当你这么做的时候也一样:
如果要制作副本,必须实现自己的机制,例如使用副本构造函数:
承包商会做任何必要的事情来创建一个
ADList
与传递给其参数的列表内容相同。这可能意味着创建新的Node
为每个Node
有着相同的数据。考虑到您要解决的问题,似乎您希望在给定的键上拆分一个链表。最好是在医院手术
Node
水平。您可以遍历原始列表(即。this
)不需要修改。然后为左侧和右侧子列表创建新节点(请参见将链接列表分成两半并返回后半部分作为示例)。