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