我正试图找到一种方法来构造一个带有for each循环的LinkedList。
我已经按照我目前的方式使用了它,而且它很有效。我只是觉得它很难看,因为我必须在循环外声明一个listNode,其余的在for循环内。我无法摆脱这种感觉——这是一个笨拙的解决方案。
如何书写-
private listNode nameList;
public listManager(ArrayList<String> names) {
nameList = new listNode(names.get(0));
listNode current = nameList;
for (int i = 1; i < names.size(); i++) {
current.next = new listNode(names.get(i));
current = current.next;
}
}
我想为每个循环使用一个,使所有内容都更可读,但当current为null时,我遇到了试图获取current.next的问题,所以我得到了一个nullpointerexception。有什么想法吗?
我希望它最好是写出来的,但不起作用-
listNode current = nameList;
for (String person : names) {
current.next = new listNode(person);
current = current.next;
}
如有任何帮助,我们将不胜感激!:)
来自我的评论:
如果你想使用一个增强的for循环,即foreach,那么你应该在它内部进行null检查。
nameList = null;
listNode current = null;
for (String person : names) {
if (nameList= null) {
nameList = new listNode(names.get(0));
current = nameList;
} else {
current.next = new listNode(person);
current = current.next;
}
}
另一个建议是:使用CamelCase作为类名以获得更好的代码可读性,listNode
类应该是ListNode
,listManager
类应该是ListManager
。
根据@crosiKa的评论,这将不是使用增强型for
循环的最佳情况(事实上,这实际上取决于我们谈论的衡量性能影响的项目数量,但这不在这个问题范围内)。为了使其成为一种更通用的算法,甚至可以支持List
(由ArrayList
实现的通用接口),您可以使用Iterator
来代替:
Iterator<String> iterNames = names.iterator();
if (iterNames.hasNext()) {
nameList = new listNode(iterNames.next());
listNode current = nameList;
while (iter.hasNext()) {
current.next = new listNode(iterNames.next());
current = current.next;
}
}
请注意,如果您仍然想坚持使用增强的for
循环方法,则无法从中删除null
检查。
for (int i = names.size() - 1; i >= 0; i--){
person = new ListNode(names.get(i), person);
}
后退使变得更容易
问题1
如果没有完整的代码要编译(这可能是非常必要的),那么很难调试。需要注意的一点是,你的两个循环并不完全相同。
第一个这样做:
for (int i = 1; i < names.size(); i++) {
第二个做
for (String person : names) {
本质上与相同
for (int i = 0; i < names.size(); i++) {
String person = names.get(i);
请注意,您的循环开始于1,但生成的。
问题2
除此之外,您的问题很可能是代码的第二部分似乎没有为头节点(namesList
)创建新节点。
解决方案
这不是使用增强的for循环的合适位置。只有当相同的操作将应用于结构中的每个元素时,才应使用增强的for循环。在这种情况下,您将第一个视为特殊情况,这会使代码复杂化。你的第一个循环,从1开始的循环,是解决这个问题的理想方法。