2

我试图找出一种方法来构造一个带有 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;
    }
}

我想使用 for-each 循环并使所有内容更具可读性,但是当 current 为 null 时,我遇到了尝试获取 current.next 的问题,因此我得到了 nullpointerexception。有任何想法吗?

我多么希望它理想地喜欢它写但不起作用 -

listNode current = nameList;
for (String person : names) {
    current.next = new listNode(person);
    current = current.next;
} 

任何帮助,将不胜感激!:)

4

3 回答 3

5

从我的评论:

如果您想使用增强的 for 循环,即 foreach,那么您应该在其中进行空值检查。

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 以获得更好的代码可读性,listNodeclass should beListNodelistManagerclass should be ListManager


根据@corsiKa 的评论,这不是使用增强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检查。

于 2013-07-16T21:54:08.683 回答
1
  for (int i = names.size() - 1; i >= 0; i--){
     person = new ListNode(names.get(i), person);
  }

倒退会让事情变得容易得多

于 2015-01-25T02:20:23.653 回答
0

问题 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开始,但生成的循环从0开始。

问题 2

除此之外,您的问题很可能是您的代码的第二部分似乎没有为您的标头节点(namesList)创建一个新节点。

解决方案

这不是使用增强型 for 循环的合适位置。仅当相同的操作将应用于结构中的每个元素时,才应使用增强的 for 循环。在这种情况下,您将第一个视为特殊情况,这会使代码复杂化。您的第一个循环,即从 1 开始的循环,是解决此问题的理想方法。

于 2013-07-16T21:54:54.883 回答