簡體   English   中英

為什么LinkedList的removeAll()和removeFirstOccurrence()不刪除節點?

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

我必須編寫這些方法的代碼。 這是一項家庭作業,不得更改方法的參數或編寫其他方法。

contains()和isEmpty()可以正常工作。 removeFirst()和removerLast()也可以很好地工作。

removeFirstOccurence()不會刪除指定元素的第一次出現。 而且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;
    }
}

這是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;

//和方法...

您永遠不會以任何方式改變任何節點

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