1. 程式人生 > >題目11 反向輸出所有節點的值,帶頭節點單鏈表

題目11 反向輸出所有節點的值,帶頭節點單鏈表

題目11:反向輸出所有節點的值,帶頭節點單鏈表

void print_Reverse(Node *n, int first){
	//這裡使用first使用來標識頭節點,頭節點中是無效資料,不列印。
	if(first==0){
		n=n->next;
		first++;
	}
	if(n->next!=NULL){
		print_Reverse(n->next, 1);   //傳入非0,標識其餘的非頭節點
	}
	cout<<n->num<<" ";
}
當然,也可以採用插入排序,反轉連結串列完成,然後遍歷。

題目12:刪除最小值節點,帶頭節點單鏈表

亮點在於定義了記錄的指標,在一次遍歷找到並記錄,然後刪除

void del_minValue(Node *&n){
	Node *minp=n->next, *minpre=n, *p=n->next, *pre=n;
	while(p!=NULL){
		if(p->num<minp->num){
			minpre = pre;
			minp = p;
		}
		pre = p;
		p = p->next;
	}
	cout<<"The minumal value is :"<<minp->num<<endl;
	minpre->next = minp->next;
	free(minp);
}

題目13:遞增輸出無序單鏈表中資料,並釋放節點

思路:遍歷整個單鏈表,迴圈體內部,每次刪除最小值

void print_ByAsc_1(Node *&n){

    while(n->next!=NULL)

              del_minValue(n);         //直接呼叫上面的函式

}

完整程式碼:
void print_ByAsc_2(Node *&n){
	Node *p,*pre,*minp, *minpre;
	while(n->next!=NULL){
		pre = minp = n;
		p = minpre = n->next;
		while(p!=NULL){
			if(p->num<minp->num){
				minpre = pre;
				minp = p;
			}
			pre = p;
			p = p->next;
		}
		cout<<minp->num<<" ";
		minpre->next = minp->next;   /**因為上面每次都會為minp/minpre賦值,
                                    所以這裡只需要保證連結串列的不斷鏈刪除,不需要考慮minp/minpre賦值情況**/
		free(minp);
	}
}

作者:無涯明月