數據結構實驗之鏈表七:單鏈表中重複元素的刪除

數據結構實驗之鏈表七:單鏈表中重複元素的刪除

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

按照數據輸入的相反順序(逆位序)建立一個單鏈表,並將單鏈表中重複的元素刪除(值相同的元素只保留最後輸入的一個)。

Input

第一行輸入元素個數 n (1 <= n <= 15);
第二行輸入 n 個整數,保證在 int 範圍內。

Output

第一行輸出初始鏈表元素個數;
第二行輸出按照逆位序所建立的初始鏈表;
第三行輸出刪除重複元素後的單鏈表元素個數;
第四行輸出刪除重複元素後的單鏈表。

Sample Input

10
21 30 14 55 32 63 11 30 55 30

Sample Output

10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21

Hint

Source

不得使用數組! 

解法:最重要的是要注意,多出的一個指針t始終跟在p的後面,以免和指針q弄混了。


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
	int data;
	struct node *next;
};
int main(){
	int n;
	int i;
	struct node *head,*p,*t,*q;
	head=(struct node *)malloc(sizeof(struct node));
	head->next=NULL;
	cin>>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);
	p=head->next;
	while(p!=NULL){
		if(p->next==NULL){
			printf("%d\n",p->data);
		}else{
			printf("%d ",p->data);
		}
		p=p->next;
	}
/*	for(p=head->next;p!=NULL;p=p->next){
		if(p->next==NULL){
			printf("%d\n",p->data);
		}else{
			printf("%d ",p->data);
		}
	}
*/
	q=head->next;
	while(q){
		t=q;
		p=q->next;
		while(p){
			if(p->data==q->data){
				t->next=p->next;
				n--;
				p=p->next;
			}else{
				t=t->next;
				p=p->next;
			}
		}
		q=q->next;	
	}
	printf("%d\n",n);
		p=head->next;
	while(p!=NULL){
		if(p->next==NULL){
			printf("%d\n",p->data);
		}else{
			printf("%d ",p->data);
		}
		p=p->next;
	}
/*	for(p=head->next;p!=NULL;p=p->next){
		if(p->next==NULL){
			printf("%d\n",p->data);
		}else{
			printf("%d ",p->data);
		}
	}
*/
}

發佈了72 篇原創文章 · 獲贊 9 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章