Programa Java para eliminar Nodes que tienen un valor mayor en el lado derecho

Dada una lista enlazada individualmente, elimine todos los Nodes que tienen un valor mayor en el lado derecho. 

Ejemplos: 

Input: 12->15->10->11->5->6->2->3->NULL
Output: 15->11->6->3->NULL
Explanation: 12, 10, 5 and 2 have been deleted because there is a 
             greater value on the right side. When we examine 12, 
             we see that after 12 there is one node with a value 
             greater than 12 (i.e. 15), so we delete 12. When we 
             examine 15, we find no node after 15 that has a value 
             greater than 15, so we keep this node. When we go like 
             this, we get 15->6->3

Input: 10->20->30->40->50->60->NULL
Output: 60->NULL
Explanation: 10, 20, 30, 40, and 50 have been deleted because 
             they all have a greater value on the right side.

Input: 60->50->40->30->20->10->NULL
Output: No Change.

Método 1 (Simple): 
Use dos bucles. En el bucle exterior, seleccione los Nodes de la lista vinculada uno por uno. En el bucle interno, verifique si existe un Node cuyo valor sea mayor que el Node seleccionado. Si existe un Node cuyo valor es mayor, elimine el Node elegido. 
Complejidad del tiempo: O(n^2)

Método 2 (Uso inverso): 
gracias a Paras por proporcionar el siguiente algoritmo. 
1. Invierta la lista. 
2. Recorra la lista invertida. Mantenga el máximo hasta ahora. Si el siguiente Node es menor que max, elimine el siguiente Node; de lo contrario, max = next node. 
3. Invierta la lista nuevamente para conservar el orden original. 
Complejidad de tiempo: O(n)
Gracias a R.Srinivasan por proporcionar el código a continuación. 

Java

// Java program to delete nodes which have
// a greater value on right side
class LinkedList
{
    // head of list
    Node head;
 
    // Linked list Node
    class Node
    {
        int data;
        Node next;
        Node(int d)
        {
            data = d;
            next = null;
        }
    }
 
    /* Deletes nodes which have a node
       with greater value node on left side */
    void delLesserNodes()
    {
        // 1.Reverse the linked list
        reverseList();
 
        /* 2. In the reversed list, delete nodes
              which have a node with greater value
              node on left side. Note that head node
              is never deleted because it is the
              leftmost node.*/
        _delLesserNodes();
 
        /* 3. Reverse the linked list again to retain
              the original order */
        reverseList();
    }
 
    /* Deletes nodes which have greater value
       node(s) on left side */
    void _delLesserNodes()
    {
        Node current = head;
 
        // Initialise max
        Node maxnode = head;
        Node temp;
 
        while (current != null &&
               current.next != null)
        {
            /* If current is smaller than max,
               then delete current */
            if (current.next.data < maxnode.data)
            {
                temp = current.next;
                current.next = temp.next;
                temp = null;
            }
 
            /* If current is greater than max,
               then update max and move current */
            else
            {
                current = current.next;
                maxnode = current;
            }
        }
    }
 
    // Utility functions
    /* Inserts a new Node at front of
       the list. */
    void push(int new_data)
    {
        /* 1 & 2: Allocate the Node &
                  Put in the data*/
        Node new_node = new Node(new_data);
 
        // 3. Make next of new Node as head
        new_node.next = head;
 
        // 4. Move the head to point to
        // new Node
        head = new_node;
    }
 
    // Function to reverse the linked list
    void reverseList()
    {
        Node current = head;
        Node prev = null;
        Node next;
        while (current != null)
        {
            next = current.next;
            current.next = prev;
            prev = current;
            current = next;
        }
        head = prev;
    }
 
    // Function to print linked list
    void printList()
    {
        Node temp = head;
        while (temp != null)
        {
            System.out.print(temp.data +
                             " ");
            temp = temp.next;
        }
        System.out.println();
    }
 
    // Driver code
    public static void main(String args[])
    {
        LinkedList llist = new LinkedList();
 
        /* Constructed Linked List is
           12->15->10->11->5->6->2->3 */
        llist.push(3);
        llist.push(2);
        llist.push(6);
        llist.push(5);
        llist.push(11);
        llist.push(10);
        llist.push(15);
        llist.push(12);
 
        System.out.println("Given Linked List");
        llist.printList();
 
        llist.delLesserNodes();
 
        System.out.println("Modified Linked List");
        llist.printList();
    }
}
// This code is contributed by Rajat Mishra

Producción:

Given Linked List 
12 15 10 11 5 6 2 3
Modified Linked List 
15 11 6 3

Complejidad de tiempo : O(n)

Espacio Auxiliar : O(1)

Método 3: El otro método más simple es recorrer la lista desde el principio y eliminar el Node cuando el Node actual < siguiente Node. Para eliminar el Node actual, siga este enfoque. Supongamos que tiene que eliminar el Node actual X:

  1. Copie los datos del siguiente Node en X, es decir, X.data = X.next.data.
  2. Copie la siguiente dirección del siguiente Node, es decir, X.next = X.next.next.

Avanzar en la lista solo cuando el Node actual sea > el siguiente Node.

Java

// Java program for above approach
import java.io.*;
 
// This class represents a single node
// in a linked list
class Node
{   
    int data;
    Node next;
     
    public Node(int data)
    {
        this.data = data;
        this.next = null;
    }
}
 
//This is a utility class for
// linked list
class LLUtil
{   
    // This function creates a linked list
    // from a given array and returns head
    public Node createLL(int[] arr)
    {       
        Node head = new Node(arr[0]);
        Node temp = head;
         
        Node newNode = null;
        for(int i = 1; i < arr.length; i++)
        {
            newNode = new Node(arr[i]);
            temp.next = newNode;
            temp = temp.next;
        }
        return head;
    }
   
      // This function prints given
      // linked list
      public void printLL(Node head)
      {       
        while(head != null)
        {
            System.out.print(head.data +
                             " ");
            head = head.next;
        }
        System.out.println();
    } 
}
 
// Driver code
class GFG
{
    public static void main (String[] args)
    {       
        int[] arr = {12, 15, 10, 11,
                     5, 6, 2, 3};
        LLUtil llu = new LLUtil();
        Node head = llu.createLL(arr);
        System.out.println("Given Linked List");
        llu.printLL(head);
        head = deleteNodesOnRightSide(head);
        System.out.println("Modified Linked List");
        llu.printLL(head);
           
    }
     
    //Main function
    public static Node deleteNodesOnRightSide(Node head)
    {
         if(head == null || head.next == null)
             return head;
 
         Node nextNode = deleteNodesOnRightSide(head.next);
 
         if(nextNode.data > head.data)
             return nextNode;
         head.next = nextNode;
 
         return head;
    }
}

Producción:

Given Linked List
12 15 10 11 5 6 2 3 
Modified Linked List
15 11 6 3

Complejidad de tiempo : O(n)

Espacio Auxiliar : O(1)

Fuente: https://www.geeksforgeeks.org/forum/topic/amazon-interview-question-for-software-engineerdeveloper-about-linked-lists-6

Consulte el artículo completo sobre Eliminar Nodes que tienen un valor mayor en el lado derecho para obtener más detalles.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *