输入一个非严格递增整数数列(以-1结束),第一行依次输出每一个数的个数,第二行输出压缩后的不含重复数的链表。
测试样例:
1 -1
1 1 -1
1 1 2 3 3 3 6 -1
1 2 3 6 6 6 6 -1
1 2 3 100 200 1000 -1
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
Node *input();
void output(Node *);
void count(Node *);
Node *shorten(Node *);
int main()
{
Node *head = NULL;
head = input();
count(head);
Node *phead = shorten(head);
output(phead);
return 0;
}
Node *input()
{
Node *head = NULL, *tail = NULL;
int x;
cin >> x;
while (x != -1)
{
Node *p = new Node;
p->data = x;
p->next = NULL;
if (head == NULL)
head = tail = p;
else
{
tail->next = p;
tail = p;
}
cin >> x;
}
return head;
}
void output(Node *head)
{
cout << endl;
for (Node *p = head; p != NULL; p = p->next)
cout << p->data << " ";
cout << endl;
}
void count(Node *head)
{
if (head == NULL)
return;
else
{
Node *s = head, *t = head->next;
int cnt = 1;
while (t != NULL && s->data == t->data)
{
cnt++;
s = s->next;
t = t->next;
}
cout << cnt << ' ';
/*下面考虑循环退出条件为s->data != t->data的情况,当然链表到头就无话可说了,只能结束*/
if (t != NULL)
{
s = s->next;
t = t->next;
count(s);
}
//纯粹是因为不等,毕竟还没有到结束位置,那么就开始下一个值的计数吧
}
}
Node *shorten(Node *s)
{
if (s == NULL)
return NULL;
Node *p = new Node;
p->data = s->data;
p->next = NULL;
Node *head = p, *tail = p;
Node *t = s->next;//t是第二个结点
while (t != NULL)
{
if (t->data != s->data)
{
Node *p = new Node;
p->data = t->data;
p->next = NULL;
tail->next = p;
tail = p;
}
//添加结点当且仅当值不同时
t = t->next;
s = s->next;
}
return head;
}