リンクリスト内の同じデータフィールドを持つ他のノードを削除します

リンクリスト内の同じデータフィールドを持つ他のノードを削除します

トピック

線形リンクリストの最初のノードのポインタがリストであることを知っているので、同じデータフィールド値を持つノードを削除するアルゴリズムを記述してください。つまり、同じデータフィールド値を持つリンクリストに複数のノードがある場合は、 1つのノードのみが保持され、残りのノードはリンクリストから削除されるため、リンクリスト内のすべてのノードのデータフィールド値は異なります。

分析

ポインタPが新しいデータノードを指していると仮定すると、ポインタが1ビット移動するたびに、それが以前に出現したかどうかをチェックする必要があり、qポインタはチェックされるたびに初期位置からチェックされるため、時間計算量が複雑になります。 O(n ^ 2)です。

例えば

元のリンクリストのデータ:{1,2,2,4,2,6}
削除後のデータは次のとおりです:{ 1,2,4,6 }

コード1

// 删除链表中数据域相同的其他结点
void DELETE3(LinkList list){    
	LinkList p,q,r;    
	p=list;    
	r=p;    
	p=p->link;    
	int flag=0;    
	while (p!=NULL){        
		q=list;        
		while (q!=p){           
			if (q->data!=p->data){              
				q=q->link;           
			}else{               
				flag=1;               
				break;          
	 		}// if       
	 	}// while       
	  	if (flag==1){          
	   		r->link=p->link;           
	   		free(p);           
	   		p=r->link;           
	   		flag=0;        
	  	}else{           
	    		r=p;            
	    		p=p->link;       
	      }// if 
	}// while
}

コード1は少し面倒です。2番目のコードを参照してください。フラグなどを設定せずに、直接トラバースして削除してください。

コード2

typedef struct node{    
	int data;    
	struct node *link;
}Node,*Linklist;
Linklist DELETE(Linklist list){    
	Linklist p,q ,r;    
	p=list;   
	while (p!=NULL) {        
		r=p;       
		q=p->link;       
		while(q!=NULL){           
			if (q->data==p->data){               
				r->link=q->link;               
				free(q);               
				q=r->link;          
			}else{               
				r=q;              
			 	q=q->link;           
			}       
		}//while       
	p=p->link;  
 }   // while
 return list;
}

時間計算量は変更されていませんが、コードはより理解しやすくなっています。

おすすめ

転載: blog.csdn.net/honeylife/article/details/98958366