📜  链表中第二小的元素

📅  最后修改于: 2022-05-13 01:57:06.248000             🧑  作者: Mango

链表中第二小的元素

给定整数数据的链接列表。任务是编写一个程序,有效地找到链表中存在的第二小的元素。
例子:

Input : List = 12 -> 35 -> 1 -> 10 -> 34 -> 1
Output : The second smallest element is 10.

Input : List = 10 -> 5 -> 10
Output : The second largest element is 10.

一个简单的解决方案是首先按升序对链表进行排序,然后打印排序后的链表中的第二个元素。该解决方案的时间复杂度为 O(nlogn)。
更好的解决方案是遍历链表两次。在第一次遍历中找到最小元素。在第二次遍历中找到比第一次遍历中获得的元素大的最小元素。该解决方案的时间复杂度为 O(n)。
有效的解决方案是在一次遍历中找到第二小的元素。

C++
// C++ program to print second smallest
// value in a linked list
#include 
#include 
 
using namespace std;
 
// A linked list node
struct Node {
    int data;
    struct Node* next;
};
 
// Function to add a node at the
// beginning of 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 print the second
// smallest element
void print2smallest(struct Node* head)
{
    int first = INT_MAX, second = INT_MAX;
 
    struct Node* temp = head;
    while (temp != NULL) {
 
        if (temp->data < first) {
            second = first;
            first = temp->data;
        }
 
        // If current node's data is in between
        // first and second then update second
        else if (temp->data < second && temp->data != first)
            second = temp->data;
 
        temp = temp->next;
    }
 
    if (second == INT_MAX)
        cout << "There is no second smallest element\n";
    else
        cout << "The second smallest element is " << second;
}
 
// Driver program to test above function
int main()
{
    struct Node* start = NULL;
 
    /* The constructed linked list is: 
     12 -> 35 -> 1 -> 10 -> 34 -> 1 */
    push(&start, 1);
    push(&start, 34);
    push(&start, 10);
    push(&start, 1);
    push(&start, 35);
    push(&start, 12);
 
    print2smallest(start);
 
    return 0;
}


Java
// Java program to print second smallest
// value in a linked list
class GFG
{
 
// A linked list node
static class Node
{
    int data;
    Node next;
};
 
// Function to add a node at the
// beginning of 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 new_node;
}
 
// Function to print the second
// smallest element
static void print2smallest(Node head)
{
    int first = Integer.MAX_VALUE,
        second = Integer.MAX_VALUE;
 
    Node temp = head;
    while (temp != null)
    {
 
        if (temp.data < first)
        {
            second = first;
            first = temp.data;
        }
 
        // If current node's data is in between
        // first and second then update second
        else if (temp.data < second && temp.data != first)
            second = temp.data;
 
        temp = temp.next;
    }
 
    if (second == Integer.MAX_VALUE)
        System.out.print("There is no second smallest element\n");
    else
        System.out.print("The second smallest element is " + second);
}
 
// Driver code
public static void main(String[] args)
{
    Node start = null;
 
    /* The constructed linked list is:
    12.35.1.10.34.1 */
    start = push(start, 1);
    start = push(start, 34);
    start = push(start, 10);
    start = push(start, 1);
    start = push(start, 35);
    start = push(start, 12);
 
    print2smallest(start);
}
}
 
// This code is contributed by PrinciRaj1992


Python3
# Python3 program to print second smallest
# value in a linked list
 
# A linked list node
class Node :
    def __init__(self):
        self.data = 0
        self.next = None
 
# Function to add a node at the
# beginning of 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 new_node
 
# Function to print the second
# smallest element
def print2smallest(head):
 
    first = 32676
    second = 32676
 
    temp = head
    while (temp != None):
     
        if (temp.data < first):
         
            second = first
            first = temp.data
         
        # If current node's data is in between
        # first and second then update second
        elif (temp.data < second and temp.data != first):
            second = temp.data
 
        temp = temp.next
     
    if (second == 32676):
        print("There is no second smallest element")
    else:
        print("The second smallest element is " , second)
 
# Driver code
 
start = None
 
# The constructed linked list is:
# 12.35.1.10.34.1
start = push(start, 1)
start = push(start, 34)
start = push(start, 10)
start = push(start, 1)
start = push(start, 35)
start = push(start, 12)
 
print2smallest(start)
 
# This code is contributed by Arnab Kundu


C#
// C# program to print second smallest
// value in a linked list
using System;
 
class GFG
{
 
// A linked list node
class Node
{
    public int data;
    public Node next;
};
 
// Function to add a node at the
// beginning of 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 new_node;
}
 
// Function to print the second
// smallest element
static void print2smallest(Node head)
{
    int first = int.MaxValue,
        second = int.MaxValue;
 
    Node temp = head;
    while (temp != null)
    {
 
        if (temp.data < first)
        {
            second = first;
            first = temp.data;
        }
 
        // If current node's data is in between
        // first and second then update second
        else if (temp.data < second &&
                 temp.data != first)
            second = temp.data;
 
        temp = temp.next;
    }
 
    if (second == int.MaxValue)
        Console.Write("There is no second smallest element\n");
    else
        Console.Write("The second smallest element is " +
                                                 second);
}
 
// Driver code
public static void Main(String[] args)
{
    Node start = null;
 
    /* The constructed linked list is:
    12 -> 35 -> 1 -> 10 -> 34 -> 1 */
    start = push(start, 1);
    start = push(start, 34);
    start = push(start, 10);
    start = push(start, 1);
    start = push(start, 35);
    start = push(start, 12);
 
    print2smallest(start);
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:
The second smallest element is 10

时间复杂度: O(n)