如何在Java中使用for each循环构造LinkedList



我正试图找到一种方法来构造一个带有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类应该是ListNodelistManager类应该是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开始的循环,是解决这个问题的理想方法。

相关内容

  • 没有找到相关文章

最新更新