首页 > 其他 > 详细

线性表的链式表示习题

时间:2020-04-25 23:58:38      阅读:117      评论:0      收藏:0      [点我收藏+]
设计一个递归算法,删除不带头结点的单链表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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!