数字链表
时间限制: 1S类别: DS:数组与链表->链表–较难
问题描述 :
先输入一个数,此数字为“停止数字”。
之后输入一系列数字,遇到“停止数字”时结束输入。
要求使用链表实现,并从小到大排序输出。
须使用链表实现,如果不用链表实现,即使程序提交成功,也只能得部分分数
输入说明 :
输入是一个开头与结尾相同的数字序列(即最先输入一个停止数字,最后遇到停止数字结束输入)。
输出说明 :
输出排过序的数字序列,当然,“停止数字”不包含在内。
输入范例 :
-11
32
1
24
7
3
5
14
-11
输出范例 :
1
3
5
7
14
24
32
#include<iostream>
#include<vector>
using namespace std;
int len,len1=0,no=0;
struct ListNode
{
int val;
ListNode* next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode* next) : val(x), next(next) {}
};
class Solution {
public:
int numComponents(ListNode* head, vector<int>& G)
{
//填充本函数完成功能
int i, k;
if (len == 0)
return 0;
ListNode* s = head;
bool ok = 0,ok2=0;
int sum = 0;
for (i = 0; i < len; i++)
{
for (k = 0; k < G.size(); k++)
{
if (G.at(k) == s->val)
{
ok = 1;
break;
}
}
if (ok == 1)
{
s = s->next;
ok = 0;
ok2 = 1;
continue;
}
if (ok2 == 1)
{
sum++;
ok2 = 0;
}
s = s->next;
}
if (ok2 == 1)
sum++;
return sum;
}
};
ListNode* insert(ListNode* head, int data, int n)
{
ListNode* p1 = new ListNode(data);
ListNode* p = head, * q;
for (int i = 1; i < n; i++)
p = p->next;
q = p->next;
p->next = p1;
p1->next = q;
len++;
return head;
}
int search(ListNode* head, int man)
{
ListNode* p = head;
ListNode* q = p;
int n = len1;
bool okk = 1;
while (n-- && okk != 0)
{
p = p->next;
if (p->val > man)
return len1 - n;
}
return no;
}
ListNode* createByTail(int no)
{
ListNode* head;
ListNode* p1=NULL, * p2=NULL;
int n = 0, num;
head = NULL;
while ( cin >> num)
{
if (num == no)
break;
p1 = new ListNode(num);
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
}
len = n;
return head;
}
int main()
{
int n=0;
cin >> no;
ListNode* head= createByTail(no);
if (len == 0)
return 0;
ListNode* head1 = new ListNode();
int i = 0; ListNode* p = head;
int ll = len;
for (i = 0; i < ll; i++)
{
n=search(head1, p->val);//返回比它大的值的下标
if (n != no)
{
insert(head1, p->val, n);
len1++;
}
else
{
insert(head1, p->val, len1 + 1);
len1++;
}
p = p->next;
}
p = head1;
for (i = 0; i < ll; i++)
{
p = p->next;
cout << p->val << endl;
}
return 0;
}