【问题标题】:Detecting the end of a linked list检测链表的结尾
【发布时间】:2014-04-25 12:58:48
【问题描述】:

我正在制作电话簿中条目的链接列表。但是我正在努力制定一个完整的删除方法。我正在尝试检测我要删除的条目不在列表中,并给出“找不到条目”消息。我正在使用链表的列表接口。到目前为止,这是删除方法。现在我试图在最后一个 if 语句中涵盖“最后一个节点”的情况。但它不起作用。如果我没有使用列表界面,我想我可以使用 getLast() 方法并将其与我当前使用的条目进行比较,但我更愿意这样做并找出另一种解决方法。有任何想法吗 ? --edit 它不起作用的原因是如果我删除列表中的最后一个条目,它会打印出未找到条目的消息,即使该条目作为最后一个节点存在并且已成功删除

 public void deleteEntry(String number) {
    ListIterator<Entry> i = phoneBook.listIterator();

    while(i.hasNext()){
        Entry e = i.next();
        if(e.getNumber().equals(number)){
            i.remove();
            break;
        }
    }
    if(phoneBook.size() != 0 && (!(i.hasNext()))){
        System.out.println("Entry not found");
    }
}

【问题讨论】:

  • 您考虑过使用基本的myList.remove(Object o) 方法吗?或者这是给自己实现linkedList的功课?
  • 当我删除一个条目时,每个条目都包含字符串,用于某人的姓名和电话号码。所以我必须检查每个对象,看看它是否正确。我只是想知道如何检测我是否在列表的末尾
  • 为什么是phoneBook.size() != 0?如果列表为空,则也找不到该条目...我不明白您为什么将这种情况排除在您的消息中。

标签: java linked-list listiterator


【解决方案1】:

你可以这样做:

public void deleteEntry(String number) {
    int size = phoneBook.size();
    for (ListIterator<Entry> i = phoneBook.listIterator(); i.hasNext(); ) {
        Entry e = i.next();
        if (e.getNumber().equals(number)) {
            i.remove();
            break;
        }
    }
    if (phoneBook.size() == size) {
        System.out.println("Entry not found");
    }
}

【讨论】:

  • 很好,虽然我认为它的 if(phoneBook.size() == size){print out} - 非常感谢
【解决方案2】:

break; 语句替换为return;

【讨论】:

    【解决方案3】:
    public void deleteEntry(String number) {
        ListIterator<Entry> i = phoneBook.listIterator();
        while(i.hasNext()){
            Entry e = i.next();
            if(e.getNumber().equals(number)){
                i.remove();
                return;
            }
        }
        System.out.println("Entry not found");
    }
    

    但最好将返回类型更改为boolean,并在找到数字后立即返回true,否则在最后返回false

    【讨论】:

      【解决方案4】:
      public void deleteEntry(String number) {
          ListIterator<Entry> i = phoneBook.listIterator();
          boolean found = false;
          while(i.hasNext()){
      
      
              Entry e = i.next();
              if(e.getNumber().equals(number)){
                  if(!found)
              found = true;
      
                  i.remove();
                  break;
              }
          }
          if(!found){
              System.out.println("Entry not found");
          }
      }
      

      【讨论】:

      • 如果列表中至少有一个元素,found 将始终为真,它与是否找到该条目无关。
      • 另外,你不需要if (!found),因为无论如何只要这个布尔值变为真,你就退出循环;-)即使我们不确定发现是假的,将真分配给无论如何,真正的布尔值都没有错^^
      • 我说的是循环中的 if,而不是最后一个
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多