题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
10 21 30 14 55 32 63 11 30 55 30
示例输出
10 30 55 30 11 63 32 55 14 30 21 7 30 55 11 63 32 14 21
提示
来源
不得使用数组!
- #include<stdio.h>
- #include<stdlib.h>
- struct node
- {
- int data;
- struct node *next;
- };
- void delete1(struct node *head, int n)
- {
- int i, count=0;
- struct node *p, *q, *r;
- p = head->next;
- q = p;
- while(p)
- {
- while(q->next)
- {
- if(p->data == q->next->data)
- {
- r = q->next;
- q->next = r->next;
- free(r);
- count++;
- }
- else
- q = q->next;
- }
- p = p->next;
- q = p;
- }
- printf("%d\n", n-count);
- head = head->next;
- for(i=0; i<n-count; i++)
- {
- printf("%d", head->data);
- if(i==n-count-1)
- printf("\n");
- else
- printf(" ");
- head = head->next;
- }
- }
- int main()
- {
- int n, i;
- struct node *head, *p, *q;
- head = (struct node *)malloc(sizeof(struct node));
- head->next = NULL;
- q = head;
- scanf("%d", &n);
- for(i=0; i<n; i++)
- {
- p = (struct node *)malloc(sizeof(struct node));
- scanf("%d", &p->data);
- p->next = head->next;
- head->next = p;
- }
- printf("%d\n", n);
- q = q->next;
- for(i=0; i<n; i++)
- {
- printf("%d", q->data);
- if(i==n-1)
- printf("\n");
- else
- printf(" ");
- q = q->next;
- }
- delete1(head, n);
- return 0;
- }