1 问题
问题 F: 算法2-25 有序单链表删除重复元素
时间限制: 30 Sec 内存限制: 128 MB
提交: 278 解决: 160
[提交][状态][讨论版][命题人:外部导入]
题目描述
根据一个递增的整数序列构造有序单链表,删除其中的重复元素
输入
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出
针对每组测试数据,输出包括两行,分别是删除前和删除后的链表元素,用空格隔开
如果链表为空,则只输出一行,list is empty
样例输入
5 1 2 3 4 5
5 1 1 2 2 3
0
样例输出
1 2 3 4 5
1 2 3 4 5
1 1 2 2 3
1 2 3
list is empty
2 解析
- 删除链表重复元素(仅保留第一个)
- 思路
- 删除(当p、q都非空时,执行循环)
- 两个指针q、p,p指向被删除元素,q指向被删除元素的前驱,如果q和p的结点值相等,则删除p;
- 否则,p和q都向后移动一个结点
- 删除(当p、q都非空时,执行循环)
3 参考代码
#include <cstdio>
struct LNode
{
int m_data;
LNode* m_next;
};
void Create(LNode* &L, int n){
L = new LNode;
LNode* r = L;
for (int i = 0; i != n; ++i)
{
LNode* p = new LNode;
scanf("%d", &p->m_data);
r->m_next = p;
r = p;
}
r->m_next = NULL;
}
void Show(LNode* &L){
LNode* p = L;
while(p->m_next != NULL){
printf("%d", p->m_next->m_data);
p = p->m_next;
if(p->m_next != NULL) printf(" ");
}
printf("\n");
}
void Del(LNode* &L){
LNode* p = L->m_next;
LNode* q = p->m_next;
while(p != NULL && q != NULL){
if(p->m_data == q->m_data){
p->m_next = q->m_next;
delete(q);
q = p->m_next;
}else{
p = q;
q = p->m_next;
}
}
}
int main(int argc, char const *argv[])
{
LNode *L;
int n;
while(scanf("%d", &n) != EOF){
if(n == 0){
printf("list is empty\n");
}else{
Create(L, n);
Show(L);
Del(L);
Show(L);
}
}
return 0;
}