简体   繁体   English

为什么LinkedList的removeAll()和removeFirstOccurrence()不删除节点?

[英]Why don't LinkedList's removeAll() and removeFirstOccurrence() remove the node?

I have to write code of these method. 我必须编写这些方法的代码。 It is a homework, mustn't change the methods' params, or write an other method. 这是一项家庭作业,不得更改方法的参数或编写其他方法。

The contains() and isEmpty() work correctly. contains()和isEmpty()可以正常工作。 The removeFirst() and removerLast() work well too. removeFirst()和removerLast()也可以很好地工作。

The removeFirstOccurence() doesn't remove the first ouccurence of specified element. removeFirstOccurence()不会删除指定元素的第一次出现。 And the removeAll() doesn't revove the all of specified element. 而且removeAll()不会删除所有指定的元素。

/**
 * Removes the first occurrence of the specified element in this list (when
 * traversing the list from head to tail).   * 
 * @param value  element to be removed from this list, if present
 * @return {@code true} if the list contained the specified element
 */
public boolean removeFirstOccurrence(int value) {
    if(!contains(value))
        return false;
    else{
        boolean result = false;
        Node current = head;
        while ((current != null) && !result) {
            if (current.value == value){
                current=current.next;
                size--;
                return true;
                }
            current = current.next;
        }
        return result;
    }
}
/**
 * Removes all occurrences of the specified element from this list.
 * @param value the element to remove
 * @return {@code false} if nothing changed, otherwise {@code true}
 */
public boolean removeAll(int value) {
    if(isEmpty())
        return false;
    else{
        boolean result = false;
        Node current = head;
        while ((current.next != null) && !result) {
            if (current.value == value){
                current=current.next;
                size--;
                result=true;
            }                   
            current= current.next;
        }
        return result;
    }
}

Here the first part of MyLinkedList class: 这是MyLinkedList类的第一部分:

public class MyLinkedList {

private class Node {

    private int value;
    private Node next;

    private Node(int value) {
        this.value = value;
        this.next = null;
    }

    @Override
    public String toString() {
        ...
    }
}

private Node head;
private int size;

// and the methods... //和方法...

you never alter any of the nodes in any way 您永远不会以任何方式改变任何节点

public boolean removeFirstOccurrence(int value) {
    //don't do contains(), you are looping over the entire thing anyway doing it again is useless
    if(head==null)return false;
    if(head.value==value){//does head contain the value 
        head=head.next;
        size--;
        return true;
    }
    Node prev = head;
    while ((prev.next != null)) {//actually checking prev.next if it contains the value
        if (prev.next.value == value){
            prev.next=prev.next.next; //remove link from prev to prev.next 
            size--;
            return true;
        }
        prev = prev.next;
    }
    return false;
}

public boolean removeAll(int value) {
    if(head==null)return false;
    while(head.value==value){//does head contain the value 
        head=head.next;
        size--;
        result=true;
    }
    Node prev=head;
    while ((prev.next != null)) {//actually checking prev.next if it contains the value
        (prev.next.value == value){
            prev.next=prev.next.next; //remove link from prev to prev.next 
            size--;
            result = true;
        }else {
            prev = prev.next;
        }
    }
    return result;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM