数据结构实验一,第32题:删除链表中绝对值相等的结点

描述

利用单链表表示一个整数序列,实现一个时间复杂度为O(n)的算法,对于链表中绝对值相

等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。

例如,若给定的单链表HEAD如下:

Picture1.png

删除后的单链表HEAD为:

Picture2.png

输入

多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

对于每组数据分别输出一行,依次输出删除结点后的链表元素,元素之间用空格分隔。

输入样例 1

5
21 -15 -15 -7 15
7
90 32 -90 -66 77 66 90
0

输出样例 1

21 -15 -7
90 32 -66 77

代码

#include 
using namespace std;
typedef struct link {
	int data;
	struct link* next;
}link, * linklist;

void Create(linklist& L, int n)
{
	linklist p, r;
	L = new link;
	L->next = NULL;
	r = L;
	while (n--)
	{
		p = new link;
		cin >> p->data;
		p->next = r->next;
		r->next = p;
		r = p;
	}
}

void Output(linklist L)
{
	linklist p;
	p = L->next;
	int flag = 1;
	while (p)
	{
		if (flag)
		{
			flag = 0;
			cout << p->data;
		}
		else
			cout << " " << p->data;
		p = p->next;
	}
	cout << endl;
}

void Delete(linklist& L)
{
	linklist p, r,q;
	for(p=L->next;p;p=p->next)
		for (q = p; q->next; )
		{
			if (p->data == q->next->data || p->data == -q->next->data)
			{
				r = q->next;
				q->next = q->next->next;
				delete r;
			}
			else
				q = q->next;
		}
}

int main()
{
	linklist L;
	int n;
	while (1)
	{
		cin >> n;
		if (n == 0)
			break;
		Create(L, n);
		Delete(L);
		Output(L);
	}
	return 0;
}

你可能感兴趣的:(数据结构)