Second Smallest Element in a Linked List

Given a Linked list of integer data. The task is to write a program that efficiently finds the second smallest element present in the Linked List.

Examples:

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.

A Simple Solution will be to first sort the linked list in ascending order and then print the second element from the sorted linked list. The time complexity of this solution is O(nlogn).



A Better Solution is to traverse the Linked list twice. In the first traversal find the minimum element. In the second traversal find the smallest element greater than the element obtained in first traversal. The time complexity of this solution is O(n).

A more Efficient Solution can be to find the second smallest element in a single traversal.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to print second smallest
// value in a linked list
#include <climits>
#include <iostream>
  
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Output:

The second smallest element is 10

Time complexity : O(n)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.