设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点 void Del_x_recursion(Linklist &L,int x){ if(L==NULL) return; if(L->data!=x){ Del_x_recursion(L->next,x); return; } LNode *p; p=L; L=L->next; free(p); Del_x_recursion(L,x); }
在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一 /**两个指针一次遍历**/ void Del_x_1(Linklist &L,int x){ LNode *p=L->next,*pre=L,*q; while(p!=NULL){ if(p->data==x){ q=p; p=p->next; pre->next=p; free(q); } else{ pre=p; p=p->next; } } }
设L为带头结点的单链表,编写算法从尾到头反向输出每个结点的值 /**借助栈来实现,每经过一个结点将值压入栈中,再从栈顶输出值即可。**/ void R_Print(Linklist &L){ if(L->next!=NULL) R_Print(L->next); //递归 printf(L->data); }
在带头结点的单链表L中删除一个最小值结点的高效算法(假设最小值结点唯一 LinkList Del_Min(Linklist &L){ LNode *pre=L,*p=pre->next; LNode *minpre=pre;*minp=p; //保存最小值结点及其前驱 while(p!=NULL){ if(p->data<minp->data){ minp=p; minpre=pre; } pre=p; p=p->next; } minpre->next=minp->next; free(minp); return L; }
试将带头结点的单链表就地逆置,即辅助空间复杂度为O(1) Linklist Reverse_2(Linklist L){ LNode *pre,*p=L->next,*r=p->next; p->next=NULL; //处理第一个指针 while(r!NULL){//r为空则说明p是最后一个结点 pre=p; p=r; r=r->next; p->next=pre;//指针反转 } L->next=p; //处理最后一个指针 return L; }
原文:https://www.cnblogs.com/ikigai18/p/12776098.html