Рекурсивное удаление коэффициентов из LinkedList с использованием индекса

#java #recursion #data-structures #linked-list

#java #рекурсия #структуры данных #связанный список

Вопрос:

У меня возникли небольшие трудности с рекурсивной концепцией.

Дан LinkedList с целочисленными значениями

 L1 = (2->1->4->6->3)
L2=  (1->9->6->3)
  

Функция должна удалять нечетные числа из linkedlist, начиная с целого числа N, и возвращает ссылку на новый заголовок

то есть

 L1.deleteOdd(2)  = >  (2->4->6)

L2.deleteOdd(1)  = >  (6)
  

Я реализовал обычную итеративную функцию, которая выполняет эту работу, вот она

 public node deleteOdd(int n) {

    node head = this.head;
    if (head == null)
        return head;
    while (head != null) {
        if (head.data == n) {
            node head2 = head;
            while (head2.next != null) {
                if (head2.next.data % 2 != 0) {
                    head2.next = head2.next.next;
                } else {
                    head2 = head2.next;
                }
            }
            if (head.data % 2 != 0) {
                return head.next;
            }
            return head;
        }
        head = head.next;

    }
    return head;
}
  

Теперь я пытаюсь выполнить рекурсивную функцию, я пытался что-то сделать, но, похоже, я что-то упускаю.

Моя рекурсивная функция

 public node DeleteOddR(int n) {
    node head = this.head;

    if (head == null)
        return head;
    if (head != null) {
        if (head.data == n) {
            node head2 = head;
            if (head2.next.data % 2 != 0)

            {
                head2.next = head2.next.next;

            } else {

                head2 = head2.next;
            }

            if (head.data % 2 != 0) {
                return DeleteOddR(head.next.data);
            } else {
                head.next = DeleteOddR(head.next.data);
                return head;
            }

        } else {
            head = head.next;
        }

    }
    return head;
}
  

Результаты

     node f = l1.DeleteOddR(2);
    display(f); // Gives-   >2->3->4->6
  

Я был бы признателен за помощь..

Комментарии:

1. Это не очень хороший пример для изучения рекурсивной концепции. Зачем использовать index с linkedlist?

2. Просто я знаю, с чего начать. На самом деле это не «индекс», это число, по которому мы ищем его в связанном списке, и после нахождения мы используем узел, содержащий число, в качестве заголовка. Забывая обо всех элементах перед ним l=(1,2,3,4,5,6,7,8,9,10,11,12) l.removeOdd(6) -> 6->8->10->12 ( мой новый список)

Ответ №1:

Я пишу, что это может соответствовать вашим требованиям.
Сохраните предыдущий узел и выполните рекурсию, используя его .

 public class LinkedList{

    public static void main(String[] args) {
    LinkedList node0 = new LinkedList(0);
    LinkedList node1 = new LinkedList(1);
    LinkedList node2 = new LinkedList(2);
    LinkedList node3 = new LinkedList(3);
    LinkedList node4 = new LinkedList(4);
    LinkedList node5 = new LinkedList(5);
    LinkedList node6 = new LinkedList(6);
    LinkedList node7 = new LinkedList(7);
    LinkedList node8 = new LinkedList(8);
    node0.setNext(node1);
    node1.setNext(node2);
    node2.setNext(node3);
    node3.setNext(node4);
    node4.setNext(node5);
    node5.setNext(node6);
    node6.setNext(node7);
    node7.setNext(node8);

    node0.removeOddFromVale(3, false);
    System.out.println();
    }

    public void removeOddFromVale(int value,boolean start){
    LinkedList head = this;
    LinkedList prev = this;

    if(!start){
        while(head != null){
        if(head.value == value){
            start = true;
            break;
        }
        prev = head;
        head = head.next;
        }
    }

    if(prev != null amp;amp; head != null){
        if(prev == head){
        head = head.next;
        }

        if (head != null) {
        if (head.value % 2 == 0) {
            prev.next = head.next;
        } else {
            prev = prev.next;
            head = head.next;
        }
        if (prev != null) {
            prev.removeOddFromVale(value, true);
        }
        }
    }

    }

    private LinkedList next;
    private int value;

    public LinkedList(int value){
    this.value = value;
    }

    public LinkedList getNext() {
        return next;
    }
    public void setNext(LinkedList next) {
        this.next = next;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
  

Комментарии:

1. Извините за мой поздний ответ, я действительно ценю вашу работу, но у меня это плохо работает, я не знаю почему, я тоже попытался его изменить

2. @Zok Я пробовал, это работает . Каков ваш тестовый пример?