如何解决通过引用传递Java链表中的节点
private Node<T> copyList(Node<T> cn1) {
Node<T> temp = cn1;
Node<T> newHead = null;
Node<T> end = null;
newHead = new Node<T>((T)(temp.x).clone(),null);
end = newHead;
temp = temp.next;
while (temp != null) {
end.next = new Node<T>((T)(temp.x).clone(),null);
end = end.next;
temp = temp.next;
}
// Now the entire list is created,just return its head pointer
return newHead;
}
该方法正在尝试为LinkedList
中的通用节点制作深层副本,该方法是正确的,我只是对end = newHead;
行感到困惑。 end
和newHead
不应引用同一对象吗?为什么行end = end.next;
没有更新newHead
?
很抱歉,这个问题太明显了。
解决方法
写类似的东西时:
Node x = new Node();
节点不是不是原语(不是int,long,boolean等)的地方,
您应该将其建模为:
我们创建了一些新的宝藏(new Node();
)-我们凭空想到了一个宝藏盒。它没有名字。珍宝永远不会有名字。你把它埋在沙子里。
另外,这还声明您身上有一张藏宝图,并标记了x
(地图上有名字,藏宝没有)。您将地图绘制到刚刚将新创建的宝藏埋在该地图上的位置。
然后,.
运算符是“跟随地图并挖掘”运算符,而例如=
运算符是“清除地图并用获取其他宝藏的方式覆盖它”。
“珍惜” =对象,“地图” =变量和表达式。
例如, List<List<String>>
实际上不是“字符串列表的列表”。这是包含藏宝图的列表(宝藏),而不是包含宝藏的宝藏。
对于您的具体问题:
end = newHead;
正在清除名为end
的藏宝图(不遵循end
地图,并对在此找到的藏宝做任何事情!)-并使用与newHead
完全相同的地图覆盖该地图。现在,如果您要遵循newHead
地图,您将获得与遵循end
地图相同的财富。要跟踪地图,请使用.
(或者从技术上讲,是数组访问,同步,抛出和foreach,它们也可以跟踪地图并对其产生的财富进行操作)。
因此,您有2张藏宝图,当前可指向同一张藏宝图。
然后您执行:end = end.next;
。 NOT 不会按照地图去寻宝。这会修改藏宝图本身:消灭了尽头,现在是end.next
地图指向的藏宝图。
end.next
如下:“拿起名为end
的地图。跟随地图并向下挖掘。打开宝藏箱。在里面,您会找到另一宝藏通过在藏宝箱内标记为“下一个”的小框内查看地图,在此代码(end = end.next;
中,从未遵循藏宝图,它只是复制到您拥有的end
地图上,可以清除end
之前指向的内容。
这是end = newHead;
之后的情况:
newHead
和end
是两个指向相同对象(列表的开头)的不同引用。
这是end = end.next;
之后的情况:
end
现在指向下一个节点。 newHead
不受影响,因为它是
不同的引用,因此它始终指向之前指向的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。