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