使用链接列表删除项目

时间:2013-10-24 18:43:35

标签: java list linked-list

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

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

if语句中的返回使得代码退出if语句和for循环(如果找到任何内容)。因此,当您第一次找到3时,退出for循环。删除返回,它应该正常工作。

答案 3 :(得分:0)

Ravi已经告诉过你一种方式,我不确定,但我认为你也应该替换,而不是

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
  }
}

答案 4 :(得分: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循环会更糟糕,但幸运的是,null测试会有所帮助。 ;)

现在更多化妆品:

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。