【问题标题】:Measure size/length of singly linked list in Java?在Java中测量单链表的大小/长度?
【发布时间】:2012-09-27 08:23:56
【问题描述】:

我需要帮助为 Java 中的单链表创建 int size(); 方法。

这是我目前所拥有的,但它没有返回正确的列表大小。

public int size()
{
    int size = 0;
    Node CurrNode = head;
    while(CurrNode.next != null)
    {
        CurrNode = CurrNode.next;
        size++;     
    }
    return size;
}

谁能帮我用Java实现这个方法?

【问题讨论】:

  • 看起来像一个学校示例 - 对于真实世界的代码,您可能希望使用标准库中众多 List 实现之一
  • 另外:Java 的约定是变量名以小写字母开头,因此您可能应该将 CurrNode 重命名为 currNode。它会让其他 Java 程序员更喜欢你的代码(例如,我的第一个想法是“为什么他要访问 CurrNode 类中的静态变量”,我需要第二次阅读才能看到情况并非如此)

标签: java list linked-list size


【解决方案1】:

你能做的最大的改进是使用Java Coding Convension和使用camelCase局部变量。

你可以这样写。

public int size() {
   int size = 0;
   for(Node n = head; n.next != null; n = n.next)
       size++;     
   return size;
}

由于您正在用 Java 重写一个常用的类,如果您想要更好的做事方式,我建议您看看它是如何完成的。

来自LinkedList

/**
 * Returns the number of elements in this list.
 *
 * @return the number of elements in this list
 */
public int size() {
    return size;
}

如您所见,当添加元素时,大小会增加,而当移除元素时,它的 id 会减少,这样您就不必遍历列表来获取大小。

【讨论】:

  • for(Node n = head; n.next != null; n = n.next) size++;这总是用一个短的形式给出列表中实际元素的数量
  • @daskinder 此代码假定 head 不像 LinkedList 那样只是链表的开头。如果你想让它成为一个节点,你需要检查它是否是null并添加一个。
  • .next 来自哪里?没看出是Node类的一部分,也没有变量声明。
  • @NoniA。 .next 在 OP 的示例代码中。我从提供的代码中假设有一个名为 next 的字段
  • 谢谢彼得。我很好奇,因为我在《Cracking the Coding Interview》一书中发现了.next 的这种用法,它是Node 类型的变量。这可能也是 OP 代码中的内容。
【解决方案2】:

最简单的方法是让变量跟踪初始化为 0 的大小。然后每次添加节点时它只是 size++,或 size-- 当您删除节点时。然后你的 size() 方法只需要返回这个变量而不遍历列表。

【讨论】:

  • 哦,我明白了,作业有点限制,说这适用于输入链表,我必须至少测量一次,然后才能做一个 size++/-- 用于添加/删除。我将不得不单独尝试以降低我的编码语法。
  • 如果输入链表与您添加它的类是同一类,那么它仍然可以工作。例如addList(LinkedList otherList) { addLast(otherList.head); this.size += otherList.size(); }
【解决方案3】:

您需要将列表传递给您的方法并检查 currNode!= null :

public static int size(Node currNode){
    int count = 0;
    while (currNode!= null){
        count++;
        currNode=currNode.getNext();
    }
    return count;
}

【讨论】:

    【解决方案4】:

    嗯,计算长度最简单的方法是检查 currentNode!=null 是否并保持 currentNode 递增。

    我们可以使用 while 或 for 循环来实现这一点。

    以下是使用 for 循环的示例。

    public int getLength(){
        ListNode temp = head;
        for(temp = head; temp!=null; temp=temp.getNextNode()){
    
            length++;
        }
        return length;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多