C++程序:查找链表中第二小的元素
数据元素的有序集合,每个元素都链接到其下一个元素(有时还有其前驱元素)。假设存在一个链表,我们需要找到第二小的元素。以下是几种情况。
让我们假设一些简单的输入和输出场景
让我们假设这种情况:我们有一个链表,其中包含元素“8->4->6->2->9”。遍历整个链表后,第二小的元素将是8。
Input = 8->4->6->2->9 Output = 8
链表的编程实现方式
Node* head = new Node(8); head->next = new Node(4); head->next->next = new Node(6); head->next->next->next = new Node(2); head->next->next->next->next = new Node(9); result = solve(head);
考虑另一种情况,链表中的每个元素都具有相同的值。遍历所有元素后,将找不到链表中的第二小元素。因为链表中的每个元素都具有相同的值。
Input = 1->1->1->1->1->1 Output = There is no second smallest element in Linked list
算法
执行此任务需要遵循以下步骤
分配两个变量 (S1, S2)
S1 将保存链表中最小的元素
S2 将保存链表中第二小的元素。
每次迭代,最小的元素将移动到 S1,并在遇到新的最小值时移动到 S2
当最小值 (S1) 小于新最小值时,新的最小值将成为最小值 (S1)。
新的最小值将成为最小值 (S1),而原来的最小值 (S1) 将移动到第二小值 (S2)。
经过所有可能的遍历后,最终输出中将得到第二小的元素作为结果。
示例
在 C++ 实现中,我们可以保留 2 个变量。一个用于最小值,另一个用于第二小值,然后遍历链表并更新这些变量,每次遇到较小的元素时,最小值移动到第二小值,新的最小值成为最小值。因此,每当一个元素小于最小值时,第二小值成为最小值,而最小值成为新元素。如果不是,我们将比较第二小值,并确定当前元素是否小于第二小值,然后相应地进行更新。
#include <iostream> using namespace std; class Node { public: int val; Node *next; Node(int val) { this->val = val; next = NULL; } }; int solve(Node* root) { int s1=root->val, s2=root->val; while(root) { if(root->val <= s1) { s2 = s1; s1 = root->val; } else if(root->val < s2) { s2 = root->val; } root = root->next; } return s2; } int main() { Node* head = new Node(5); head->next = new Node(8); head->next->next = new Node(9); head->next->next->next = new Node(2); head->next->next->next->next = new Node(4); cout << "Second smallest element in the linked list is : " << solve(head); return 0; }
输出
Second smallest element in the linked list is: 4
结论
时间复杂度为 O(n),因为我们只遍历链表一次。如果您发现上述信息有用,请务必访问我们的官方网站,了解更多关于编程相关主题的信息。
广告