Dada una lista enlazada de enteros. La tarea es encontrar un elemento pico en él. Se dice que un elemento de la lista es pico si NO es más pequeño que sus vecinos. Para elementos de esquina, debemos considerar solo un vecino. Por ejemplo:
- Si la lista de entrada es {5 -> 10 -> 20 -> 15}, 20 es el único elemento de pico.
- Para la lista de entrada {10 -> 20 -> 15 -> 2 -> 23 -> 90 -> 67}, hay dos elementos de pico: 20 y 90. Tenga en cuenta que es necesario devolver cualquier elemento de pico.
Los siguientes casos de esquina dan una mejor idea sobre el problema:
- Si la lista de entrada se ordena en orden estrictamente creciente, el último elemento es siempre un elemento de pico. Por ejemplo, 50 es el elemento pico en {10 -> 20 -> 30 -> 40 -> 50}.
- Si la lista de entrada se ordena estrictamente decreciente, el primer elemento es siempre un elemento de pico. 100 es el elemento pico en {100 -> 80 -> 60 -> 50 -> 20}.
- Si todos los elementos de la lista de entrada son iguales, cada elemento es un elemento de pico.
Ejemplos :
Input : List = {1 -> 6 -> 8 -> 4 -> 12} Output : 8 Input : List = {10 -> 20 -> 15 -> 2 -> 23 -> 90 -> 67} Output : 90
La idea es recorrer la lista enlazada y verificar si el elemento actual es un elemento pico o no. En caso afirmativo, devuelva el elemento actual; de lo contrario, avance en la lista.
El elemento actual será un elemento pico si es mayor que sus elementos anterior y siguiente.
El siguiente programa ilustra el enfoque anterior:
C++
// C++ implementation to find the peak // element in the Linked List #include <bits/stdc++.h> using namespace std; /* A Linked list node */ struct Node { int data; struct Node* next; }; // function to insert a node at the // beginning of the linked list void push(struct Node** head_ref, int new_data) { struct Node* new_node = new Node; new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } // Function to find the peak element int findPeak(struct Node* head) { // Return -1 to indicate that // peak does not exist if (head == NULL) return -1; // If there is only one node if (head->next == NULL) return head->data; // Traverse till last node (starting from // second node) int prev = head->data; Node *curr; for (curr = head->next; curr->next != NULL; curr = curr->next) { // check if current node is greater // than both neighbours if (curr->data > curr->next->data && curr->data > prev) return curr->data; prev = curr->data; } // We reach here when curr is last node if (curr->data > prev) return curr->data; // Peak does not exists else return -1; } // Driver program int main() { struct Node* head = NULL; // create linked list 1->6->8->4->12 push(&head, 12); push(&head, 4); push(&head, 8); push(&head, 6); push(&head, 1); cout << "Peak element is: " << findPeak(head); return 0; }
Java
// Java implementation to find the peak // element in the Linked List class GFG { // A Linked list node / static class Node { int data; Node next; }; // function to insert a node at the // beginning of the linked list static Node push( Node head_ref, int new_data) { Node new_node = new Node(); new_node.data = new_data; new_node.next = (head_ref); (head_ref) = new_node; return head_ref; } // Function to find the peak element static int findPeak( Node head) { // Return -1 to indicate that // peak does not exist if (head == null) return -1; // If there is only one node if (head.next == null) return head.data; // Traverse till last node (starting from // second node) int prev = head.data; Node curr; for (curr = head.next; curr.next != null; curr = curr.next) { // check if current node is greater // than both neighbours if (curr.data > curr.next.data && curr.data > prev) return curr.data; prev = curr.data; } // We reach here when curr is last node if (curr.data > prev) return curr.data; // Peak does not exists else return -1; } // Driver program public static void main(String args[]) { Node head = null; // create linked list 1.6.8.4.12 head=push(head, 12); head=push(head, 4); head=push(head, 8); head=push(head, 6); head=push(head, 1); System.out.print("Peak element is: " + findPeak(head)); } } // This code is contributed by Arnab Kundu
Python3
# Python3 implementation to find the peak # element in the Linked List # Link list node class Node : def __init__(self): self.data = 0 self.next = None # function to insert a node at the # beginning of the linked list def push( head_ref, new_data) : new_node = Node() new_node.data = new_data new_node.next = (head_ref) (head_ref) = new_node return head_ref # Function to find the peak element def findPeak( head): # Return -1 to indicate that # peak does not exist if (head == None) : return -1 # If there is only one node if (head.next == None) : return head.data # Traverse till last node (starting from # second node) prev = head.data curr = head.next while( curr.next != None ): # check if current node is greater # than both neighbours if (curr.data > curr.next.data and curr.data > prev) : return curr.data prev = curr.data curr = curr.next # We reach here when curr is last node if (curr.data > prev) : return curr.data # Peak does not exists else: return -1 # Driver program head = None # create linked list 1.6.8.4.12 head = push(head, 12) head = push(head, 4) head = push(head, 8) head = push(head, 6) head = push(head, 1) print("Peak element is: ", findPeak(head)) # This code is contributed by Arnab Kundu
C#
// C# implementation to find the peak // element in the Linked List using System; class GFG { // A Linked list node / public class Node { public int data; public Node next; }; // function to insert a node at the // beginning of the linked list static Node push(Node head_ref, int new_data) { Node new_node = new Node(); new_node.data = new_data; new_node.next = (head_ref); (head_ref) = new_node; return head_ref; } // Function to find the peak element static int findPeak(Node head) { // Return -1 to indicate that // peak does not exist if (head == null) return -1; // If there is only one node if (head.next == null) return head.data; // Traverse till last node // (starting from second node) int prev = head.data; Node curr; for (curr = head.next; curr.next != null; curr = curr.next) { // check if current node is greater // than both neighbours if (curr.data > curr.next.data && curr.data > prev) return curr.data; prev = curr.data; } // We reach here when curr is last node if (curr.data > prev) return curr.data; // Peak does not exists else return -1; } // Driver Code public static void Main(String[] args) { Node head = null; // create linked list 1.6.8.4.12 head = push(head, 12); head = push(head, 4); head = push(head, 8); head = push(head, 6); head = push(head, 1); Console.Write("Peak element is: " + findPeak(head)); } } // This code is contributed by Rajput-Ji
Javascript
<script> // JavaScript implementation to find the peak // element in the Linked List // A Linked list node / class Node { constructor() { this.data = 0; this.next = null; } } // function to insert a node at the // beginning of the linked list function push(head_ref, new_data) { var new_node = new Node(); new_node.data = new_data; new_node.next = head_ref; head_ref = new_node; return head_ref; } // Function to find the peak element function findPeak(head) { // Return -1 to indicate that // peak does not exist if (head == null) return -1; // If there is only one node if (head.next == null) return head.data; // Traverse till last node // (starting from second node) var prev = head.data; var curr; for (curr = head.next; curr.next != null; curr = curr.next) { // check if current node is greater // than both neighbours if (curr.data > curr.next.data && curr.data > prev) return curr.data; prev = curr.data; } // We reach here when curr is last node if (curr.data > prev) return curr.data; // Peak does not exists else return -1; } // Driver Code var head = null; // create linked list 1.6.8.4.12 head = push(head, 12); head = push(head, 4); head = push(head, 8); head = push(head, 6); head = push(head, 1); document.write("Peak element is: " + findPeak(head)); </script>
Producción:
Peak element is: 8