题目11 反向输出所有节点的值,带头节点单链表

版权声明:作者:weizu_cool https://blog.csdn.net/qq_26460841/article/details/83243414

题目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);
	}
}

作者:无涯明月 

猜你喜欢

转载自blog.csdn.net/qq_26460841/article/details/83243414