单链表中找到最小元素作首元结点
【问题描述】有一个带头结点的无序单链表(表中无重复元素),在链表中找到最小元素的结点,将其插入到链表的表头作为首元结点,假设单链表中的元素值均为正整数,建立链表时,输入-1时停止创建新结点。要求:定义一个独立函数(即非类的成员函数)实现。
【输入形式】输入若干个正整数(无重复),各个整数之间用空格分开,最后输入-1。
【输出形式】第1行输出原链表,第2行输出修改后的链表,具体格式见样例输出。
【样例输入】
7 2 4 5 1 8 -1
【样例输出】
7–>2–>4–>5–>1–>8
1–>7–>2–>4–>5–>8
代码如下:
#include "iostream"
using namespace std;
struct LinkNode
{
int data;
LinkNode* link;
};
class List
{
public:
List()
{
head = new LinkNode;
head->link = NULL;
}List(int x)
{
head = new LinkNode;
head->data = x;
head->link = NULL;
}
~List()
{
}
bool creat(int x)
{
if (head == NULL)
return false;
LinkNode* current;
current = head;
LinkNode* newNode = new LinkNode;
newNode->data = x;
while (current != NULL)
{
if (current->link == NULL)
{
current->link = newNode;
newNode->link = NULL;
break;
}
else
{
current = current->link;
}
}
return true;
}
bool search_k(int k, int& num)
{
LinkNode* left, * right;
left = head;
right = head;
int count = 0;
left = left->link;
while (count < k)
{
right = right->link;
if (right == NULL)
{
return false;
}
count++;
}
while (right != NULL)
{
if (right->link == NULL)
{
num = left->data;
return true;
}
right = right->link;
left = left->link;
}
}
LinkNode* get_head()
{
return this->head;
}
void display()
{
LinkNode* p = head;
p = p->link;
while (p != NULL)
{
if (p->link != NULL)
{
cout << p->data << "-->";
}
else
{
cout << p->data << endl;
}
p = p->link;
}
}
private:
LinkNode* head;
};
void min_change(List& temp)
{
LinkNode* head = temp.get_head();
LinkNode* current = head;
LinkNode* Min = head->link;
LinkNode* t = head, * p;
while (current->link != NULL)
{
p = current;
current = current->link;
if (current->data < Min->data)
{
t = p;
Min = current;
}
if (current->link == NULL)
{
if (Min == head->link)
{
continue;
}
else
{
t->link = Min->link;
Min->link = head->link;
head->link = Min;
}
}
}
}
int main()
{
List SingleList;
int num;
while (cin >> num && num != -1)
{
SingleList.creat(num);
}
SingleList.display();
min_change(SingleList);
SingleList.display();
return 0;
}