版权声明:作者: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);
}
}
作者:无涯明月