【问题标题】:Using Linked List to remove items使用链表删除项目
【发布时间】:2013-10-24 18:43:35
【问题描述】:

我正在编写此代码以从链接列表中删除项目。 所以说列表是 {3,3,7,8,4,3,0,4} .. 我想删除所有 3 我的输出应该是 7, 8, 4, 0, 4

我创建的代码只是删除了三个中的一个,而不是全部。

public void eraseNumber(Object x)
{
   if (start == null)
     return;
   else if (start.data.equals(x)) {
     start = start.next;
     count--;
   }
  else {
    Node ptr;
    for (ptr = start; ptr.next != null; ptr = ptr.next) {
      if (ptr.next.data.equals(x)) {
        ptr.next = ptr.next.next;
        count--;
        return;
      }
    }
  }

我得到的这段代码的输出是 3、7、8、4、3、0、4。

【问题讨论】:

  • 这是一道作业题吗?
  • Object 真的是您可以/想要用作方法输入的最具体的吗?我问,因为该方法名为 eraseNumber,它比 Object 更具体。

标签: java list linked-list


【解决方案1】:

由于这是if-elseIf 构造,代码将输入第一个elseif,然后退出方法而不输入最后一个else

使用 while 或 for 循环遍历链表。

【讨论】:

    【解决方案2】:

    如果找到任何内容,if 语句中的 return 会使您的代码退出 if 语句和 for 循环。因此,当您第一次找到 3 时,您将退出 for 循环。删除退货,它应该可以正常工作。

    【讨论】:

      【解决方案3】:

      Ravi 已经告诉了你一个方法,我不确定,但我认为你也应该用 while 替换 if

      if (start == null)
       return;
      while (start.data.equals(x)) { // use while here
       start = start.next;
       count--;
      }
      Node ptr;
      for (ptr = start; ptr.next != null; ptr = ptr.next) {
        while (ptr.next != null && ptr.next.data.equals(x)) { //while to remove a sequence of 3's
          ptr.next = ptr.next.next;
          count--;
          // return; don't exit here
        }
      }
      

      【讨论】:

      • 在代码的下半部分使用 while 循环,看来您肯定会引发 NullPointerException。
      • 没错,我在循环中添加了第二个条件
      • 您在 while 循环中复制了 for 循环的一些功能。你真的不需要它。 if 工作得很好。
      • 不! 43333 的序列将导致 4X3X3,因为它只会检查 next 是否为 3 并将其替换为 next.next,然后将 ptr 设置为 next,这可能再次为 3 -> 错误
      • 一般来说,我会使用一个迭代器类,带有删除功能,代码少但更灵活
      【解决方案4】:

      如果要删除的号码恰好位于 start 或在您的 for 循环中找到匹配项,则您只是从方法中 returning。您需要删除 if-else 以让程序运行您的 for 循环并删除 return; 以让您遍历所有列表元素。

      还要注意使用while 循环来删除列表中start 处的所有匹配数字。

      while (start != null && start.data.equals(x)) { // use while here
       start = start.next;
       count--;
      }
      
      for (Node ptr = start; ptr != null && ptr.next != null;) {
        if (ptr.next.data.equals(x)) {
          ptr.next = ptr.next.next;
          count--;
        } else // conditional increment
          ptr = ptr.next;
      }
      

      【讨论】:

      • 在代码的下半部分使用 while 循环,看来您肯定会引发 NullPointerException。
      • @TheMorph 感谢您的关注。我已经完全取消了while。不喜欢 loop in a loop 方法,同时仍然像以前一样消除连续匹配。
      【解决方案5】:

      我看到了很多东西:

      首先,您的最后一个 return 语句将使该方法在您第一次找到等于 x 的元素时返回。你应该删除它。这是错误的原因之一。

      我想你想在这里使用一个 while 循环,以便在 start 的开头找到每个 x

      else if (start.data.equals(x)) {
         start = start.next;
         count--;
      }
      

      现在看看如果start 只包含一个元素,而这一个元素也等于x 会发生什么?您将在此处收到异常

      for (ptr = start; ptr.next != null; ptr = ptr.next) {
      

      正如您所称的 null.next 不存在。实际上,使用 while 循环会更糟,但幸运的是,空测试会有所帮助。 ;)

      现在是更多的化妆品:

      这个

      if (start == null)
           return;
      else if (start.data.equals(x)) {
      

      可以写成

      if (start == null)
           return;
      if (start.data.equals(x)) {
      

      通过省略else,它变得更容易阅读,即使它的行为相同。


      这就是我要写的:

      public void eraseNumber(Object x) {
      
         while (start != null && start.data.equals(x) {
            start = start.next;
            count--;
         }
      
         Node lastNode = start;
         Node currentNode = start;
      
         while (currentNode != null) {
            if (currentNode.data.equals(x)) {
               lastNode.next = currentNode.next;
               count--;
            } else {
               lastNode = currentNode;
            }
            currentNode = currentNode.next;
         }
      
      }
      

      您可能想用更具体的内容替换 Object

      注意:我必须修复我的实现中缺少链表中第一个 x 的错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-06
        • 2014-03-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-06
        • 1970-01-01
        • 2020-08-30
        • 2013-03-29
        相关资源
        最近更新 更多