从“LinkedList”中删除元素

时间:2015-08-17 21:08:52

标签: java linked-list nodes

伙计们,我的代码必须从列表中删除某个元素。它必须删除列表中的所有出现。例如,如果我想删除"3",则输入为:

1
2
3
4
3
5

然后输出应该是:

1
2
4
5

但我的代码只删除了元素的最后一次出现,因为在我运行代码时可以看到它:

3
4
3
2
1

After removing element 3 


 4
 3
 2
 1

请问smb请帮帮我吗?提前谢谢!

public void removeElements(String number){
        if(isEmpty()){
            System.out.println("The list is empty!");
        }
        else{
            if(firstLink.data.equals(number)){
                firstLink = firstLink.next;
            }
            else{
                Link current = firstLink.next;
                Link previous = firstLink;
                while(current != null){
                    if(current.data.equals(number)){
                        previous.next = current.next;
                        break;
                    }
                    else{
                        previous = current;
                        current = current.next;
                    }
                }
            }
        }
    }

4 个答案:

答案 0 :(得分:2)

你在第一场比赛中删除元素的循环正在中断。也许像下面这样的东西会更好。当current是匹配时,更新previous.next但是先前指向前一个节点,当它不匹配时,更新previous以指向当前节点。

while (current != null) {
    if (current.data.equals(number)) previous.next = current.next;
    else previous = current;
    current = current.next;
}

答案 1 :(得分:0)

删除break,你的循环第一次进入后就会断开。

另一点是,它落入你的if(firstLink.data.equals(number))并完全忽略else块。你不应该在else中拥有该块。它应该在外面。

    if(firstLink.data.equals(number)){
        firstLink = firstLink.next;
    }
    Link current = firstLink.next;
    Link previous = firstLink;
    while(current != null){
       if(current.data.equals(number)){
          previous.next = current.next;
       } else {
            previous = current;
            current = current.next;
       }
   }

答案 2 :(得分:0)

您可以做的是遍历整个循环并检查元素的值是否与搜索到的值匹配。如果是,那么您可以使用删除该元素。我不会放弃解决方案,但我可以为你提供算法。

for(int i = 0; i < length of list; i++)
{
    if(ith element of the list == value to be removed)
        //remove the ith term using .remove(i) method     
}

答案 3 :(得分:0)

您可以做的是创建一个包含要从LinkedList中删除的所有值的新集合,然后在列表中调用removeAll:

ArrayList<String> numbersToRemove = new ArrayList<String>();
numbersToRemove.add("3");

list.removeAll(numbersToRemove);

这样,如果您想稍后删除多个数字,只需将它们添加到numbersToRemove即可。

其他一些答案更简单,更简单,所以如果它们有意义,请使用它们,例如遍历列表并删除与要删除的元素匹配的任何元素。唯一的问题是,如果在使用object:list语法迭代列表时修改列表,则会得到ConcurrentModificationException,如果使用索引迭代它,可能会得到索引超出范围异常,因此您将可能需要做这样的事情:

while (list.contains("3")) {
    ll.remove("3");
}