Как рекурсивно удалять узлы с определенным значением в списке - PullRequest
0 голосов
/ 25 сентября 2018

Я уже предоставил код, который удаляет элемент или элементы, но теперь я хочу сделать это рекурсивно.Например, если вы хотите удалить элемент 5, он перебирает список и находит все 5, которые находит, и удаляет их.

это код:

private class Node {

    private T value;
    private Node next;

    private Node(T value, Node next) {
        this.value = value;
        this.next = next;
    }

//    private Node() {

//    }
}

private Node head;


public void delete(T element) {

    Node current = head;
    if(current.value == element){
        head = current.next;
    }
    current = head;
    Node toDelete = current.next;

    while (current.next != null) {
        while (toDelete.value != element) {
            current = current.next;
            if (current.next == null) {
                return;
            }
            toDelete = current.next;
        }
        if (toDelete.value == element) {
            current.next = toDelete.next;
            toDelete = current.next;
        }
    }
}

1 Ответ

0 голосов
/ 25 сентября 2018
public void delete(T element) {
    //In case, list is empty. 
    if(head == null) return;

    //If the head's value equals element, replace the head with its successor.
    if(head.value == element){
        head = head.next;
        delete(element);
        return;
    }
    //recursive call, if the head's value doesn't equal to the element anymore.
    delete_helper(element,head,head.next)
}

public void delete_helper(T element, Node pre, Node curr){
    //In case, curr's predecessor was the last element in the list.
    if(curr == null) return;

    //If the current value equals the element, skip the current node
    if(element == curr.value){
        pre.next = curr.next;
        delete_helper(element,pre,curr.next);
        return;
    }

    //recursive call with next node.
    delete_helper(element,curr,curr.next);
}
...