0

我正在处理此代码以从链接列表中删除项目。所以说列表是 {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。

4

5 回答 5

0

拉维已经告诉你一个方法,我不确定,但我认为你也应该用 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
  }
}
于 2013-10-24T18:52:29.803 回答
0

我看到了很多东西:

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

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

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 的错误。

于 2013-10-24T19:40:07.517 回答
0

return如果要删除的数字恰好位于循环start中或在循环中找到匹配项,则您只需从方法中获取for。您需要删除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;
}
于 2013-10-24T18:48:09.293 回答
0

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

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

于 2013-10-24T18:48:52.957 回答
0

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

于 2013-10-24T18:48:58.200 回答